Julia 将布尔的矩阵写成0,1矩阵

Julia 将布尔的矩阵写成0,1矩阵,julia,Julia,例如,我有一个由Bool值组成的矩阵 x = bitrand(2,3) 如果我尝试将其保存到文件: writedlm("mat.txt", x) 我得到的矩阵是true和false。我想得到一个0和1的矩阵(其中0代表false,1代表true)。有没有一种简单的方法可以做到这一点,也许是通过writedlm中的一些选项,而不是我自己一行一行地写文件 writedlm("mat.txt", map(Int8,x)) 获取x的每个元素,并使用Int8函数/构造函数将其转换为整数 您也可以使用

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

x = bitrand(2,3)
如果我尝试将其保存到文件:

writedlm("mat.txt", x)
我得到的矩阵是
true
false
。我想得到一个
0
1
的矩阵(其中0代表false,1代表true)。有没有一种简单的方法可以做到这一点,也许是通过
writedlm
中的一些选项,而不是我自己一行一行地写文件

writedlm("mat.txt", map(Int8,x))
获取
x
的每个元素,并使用
Int8
函数/构造函数将其转换为整数


您也可以使用其他整数类型,但是
Int8
比例如
Int64
更节省内存

另一个稍微快一点的选项是将数组作为
array{UInt8,ndims(x)}(x)
动态复制到
UInt8
,而不是应用
map

>>> x = bitrand(100,100)
>>> a = map(UInt8, x)
>>> b = Array{UInt8, ndims(x)}(x)
>>> all(a .== b)
true
我快速运行了一些测试,矩阵越大,速度就越快(至少在我的电脑中是这样)

产出:

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)

试试
1*x
,它得到的是数字版本(也许不是超级内存/时间效率,但对于非“大数据”的东西来说已经足够好了)
0x1*x
将获得更大的内存压缩(但可能更慢)。

您也可以使用
Int8
实现同样的效果,但内存效率更高。使用800x800矩阵进行了尝试,
Int64
使用了4.8MB,而
Int8
仅使用了0.6MB。这需要将转换矩阵的完整副本加载到内存中。我在一个循环中执行这个
writedlm
,所以我认为对性能的影响太大了。是否有
map
的延迟版本?我在谷歌上搜索,但找不到。有和。如果这些不适合您,您不妨编写您的IO(输入/输出)可能会比映射慢得多。您可以使用Julia中的内置探查器来测试这一点。尝试
1*x
,它会得到数字版本(可能不是超级内存/时间效率,但对于非“大数据”内容来说已经足够好了)
0x1*x
将获得更大的内存压缩(但可能更慢)。@DanGetz您应该将此作为答案发布。这是最简单的解决方案。我通常理解“cast”一词的意思是Julia中所谓的重新解释,即以不同的方式查看内存中的相同位。然而,你又在这里创建了一个新的矩阵。@DavidP.Sanders我同意cast不应该创建副本,也许这不是最好的词(改写为副本)<如果
x
是一个
数组{Bool}
,则code>reinterpret(UInt8,x)是最好的解决方案,但是,
bitrand
返回一个
BitArray
,而
reinterpret
不支持该方法。
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)