2015-04-14 6 views
17

मैं बूलियन 2 डी सरणियों के लिए एक समारोह लिख रहा था:जूलिया में ऐरे {बूल} और बिटरारे के बीच क्या अंतर है और वे कैसे संबंधित हैं?

function foo(A::Array{Bool,2}) 
    ... 
end 

का मूल्यांकन और

A = randbool(3,3) 
foo(A) 

रिटर्न के साथ यह

ERROR: 'foo' has no method matching foo(::BitArray{2}) 

जाहिर परीक्षण, randbool() एक BitArray उत्पन्न करता है, जबकि मैं randbool() ग्रहण Array{Bool} उत्पन्न करेगा।

Array{Bool} और BitArray संबंधित कैसे हैं? वे दोनों क्यों मौजूद हैं?

क्या मैं foo() लिख सकता हूं इस तरह से कि यह एक विधि का उपयोग करके इनपुट प्रकार दोनों स्वीकार करता है (क्योंकि मुझे कोई अंतर नहीं दिखाई दे रहा है)?

+3

'रैंडबूल' के व्यवहार के बारे में आपकी धारणा अनुचित नहीं है - यह एक बहुत बुरा नाम है! इसे 0.4 में बहिष्कृत कर दिया गया है और इसका नाम बदलकर 'बिट्रैंड 'किया गया है (जो अधिक लगता है जैसे यह बिटरायर बनायेगा)। और स्पष्ट रूप से 'बूल' की सरणी बनाने के लिए 'रैंड (बूल, ...)' की एक नई विधि है। आप [compat] (https://github.com/JuliaLang/Compat.jl) पैकेज के साथ 0.3 में इन नई परिभाषाओं का उपयोग शुरू कर सकते हैं। –

उत्तर

18

एक Array{Bool} प्रत्येक true/false मूल्य Bool के रूप में स्टोर करता है, जिसे आंतरिक रूप से UInt8 के रूप में दर्शाया जाता है। इसलिए यदि आपके सरणी में N तत्व हैं, तो इसे स्टोर करने के लिए N बाइट्स ले लेंगे।

BitArray प्रत्येक true/false मूल्य को एक बिट के रूप में स्टोर करता है, जिसमें (अवधारणात्मक रूप से) 8 उनमें से एक को UInt8 में पैक किया जाता है। नतीजतन, सरणी को स्टोर करने के लिए केवल N/8 बाइट्स लेते हैं। BitArray में विधियों को भी परिभाषित किया गया है जो आपके लिए आवश्यक सभी बिट-ट्विडलिंग ऑपरेशंस को संभालते हैं।

ऑपरेशन के आधार पर, BitArray एस कभी-कभी Array{Bool}, और कभी-कभी तेज़ से धीमे होते हैं। लेकिन बड़े पैमाने पर प्रदर्शन अंतर काफी छोटे होते हैं, इसलिए BitArrays का उपयोग करना समझ में आता है जब तक कि आपके पास कोई विशिष्ट कारण न हो। लेकिन कुल मिलाकर वे काफी अंतर-परिवर्तनीय हैं।

ध्यान दें कि दोनों AbstractArray{Bool} के उपप्रकार हैं:

julia> BitArray <: AbstractArray{Bool} 
true 

julia> Array{Bool} <: AbstractArray{Bool} 
true 

इससे सामान्य तरीकों है कि या तो एक ले लिखने के लिए बनाता है।

+2

'सार सारणी {बूल} 'बिल्कुल वही प्रकार है जिसे मैं ढूंढ रहा था। – reschu

संबंधित मुद्दे