我有一个Bool
值的矩阵,例如
x = bitrand(2,3)
如果我尝试将其保存到文件中:
writedlm("mat.txt", x)
我得到true
和false
的矩阵。我希望得到一个0
和1
的矩阵(其中0代替false,1代替true)。是否有一种简单的方法可以通过writedlm
中的某些选项执行此操作,而无需自行逐行编写文件?
答案 0 :(得分:5)
writedlm("mat.txt", map(Int8,x))
使用x
的每个元素,并使用Int8
函数/构造函数将其转换为整数。
您也可以使用其他整数类型,但Int8
的内存效率高于示例Int64
。
答案 1 :(得分:3)
尝试1*x
,它获得数字版本(可能不是超级内存/时间效率,但对于非“大数据”内容足够好)。 0x1*x
将获得一个UInt8 - 更紧凑的内存(但可能更慢)。
答案 2 :(得分:0)
另一个稍微快一点的选项就是将数组复制到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