writed一个Bool矩阵作为0,1矩阵

时间:2016-03-31 13:23:07

标签: julia

我有一个Bool值的矩阵,例如

x = bitrand(2,3)

如果我尝试将其保存到文件中:

writedlm("mat.txt", x)

我得到truefalse的矩阵。我希望得到一个01的矩阵(其中0代替false,1代替true)。是否有一种简单的方法可以通过writedlm中的某些选项执行此操作,而无需自行逐行编写文件?

3 个答案:

答案 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