我Bool
值的矩陣,例如writedlm布爾矩陣爲0,1矩陣
x = bitrand(2,3)
如果我嘗試這個保存到一個文件:
writedlm("mat.txt", x)
我得到矩陣true
和false
。我想獲得一個0
和1
的矩陣(其中0代替false,1代替true)。有沒有一種簡單的方法來做到這一點,也許通過writedlm
中的某些選項,而無需逐行寫入文件?
我Bool
值的矩陣,例如writedlm布爾矩陣爲0,1矩陣
x = bitrand(2,3)
如果我嘗試這個保存到一個文件:
writedlm("mat.txt", x)
我得到矩陣true
和false
。我想獲得一個0
和1
的矩陣(其中0代替false,1代替true)。有沒有一種簡單的方法來做到這一點,也許通過writedlm
中的某些選項,而無需逐行寫入文件?
嘗試1*x
,它得到的數字版本(也許不是超級記憶/次有效,但對於非 「大數據」 的東西不夠好)。 0x1*x
將獲得一個UInt8 - 更緊湊的內存(但可能更慢)。
另一種選擇是稍快於副本數組UInt8
上飛爲Array{UInt8, ndims(x)}(x)
,而不是應用map
:
>>> x = bitrand(100,100)
>>> a = map(UInt8, x)
>>> b = Array{UInt8, ndims(x)}(x)
>>> all(a .== b)
true
我快了一些測試,它是悅目更快越大矩陣(至少在我的電腦裏)。
for i in [10, 100, 1_000, 10_000]
x = bitrand(i,i)
println("$i x $i")
@time map(UInt8, x)
@time Array{UInt8, ndims(x)}(x)
end
輸出:
10 x 10
0.000002 seconds (2 allocations: 208 bytes)
0.000006 seconds (2 allocations: 208 bytes)
100 x 100
0.000053 seconds (2 allocations: 9.891 KB)
0.000018 seconds (2 allocations: 9.891 KB)
1000 x 1000
0.001945 seconds (5 allocations: 976.703 KB)
0.001490 seconds (5 allocations: 976.703 KB)
10000 x 10000
0.224491 seconds (5 allocations: 95.368 MB)
0.117774 seconds (5 allocations: 95.368 MB)
我通常將「cast」這個詞理解爲Julia被稱爲「reinterpret」的含義,即以不同的方式查看內存中的相同位。然而,在這裏,你再次創建一個* new *矩陣。 –
@ DavidP.Sanders我同意* cast *不應該創建一個副本,也許這裏不是最好的單詞(重寫爲* copy *)。如果'x'是一個'Array {Bool}','reinterpret(UInt8,x)'是最好的解決方案,然而'bitrand'返回一個'reinterpret'不支持的'BitArray'。 –
嘗試'1 * x',它會得到數字版本(可能不是超級內存/時間效率,但足夠適用於非「大數據」的東西)。 '0x1 * x'會得到更緊湊的UInt8內存(但可能更慢)。 –
@DanGetz你應該將其作爲答案發布。這是最簡單的解決方案。 – becko