我有 0-1 值向量,我需要对其进行一些矩阵运算。它们不是很稀疏(只有一半的值是 0),但是将它们保存为逻辑变量而不是 double 可以节省 8 倍的内存:1 字节用于逻辑,8 用于双浮点。
对逻辑向量和双精度矩阵进行矩阵乘法会比将两者都用作双精度矩阵要慢吗?请参阅下面的初步结果:
>> x = [0 1 0 1 0 1 0 1]; A = rand(numel(x)); xl = logical(x);
>> tic; for k = 1:10000; x * A * x'; end; toc %'
Elapsed time is 0.017682 seconds.
>> tic; for k = 1:10000; xl * A * xl'; end; toc %'
Elapsed time is 0.026810 seconds.
>> xs = sparse(x);
>> tic; for k = 1:10000; xs * A * xs'; end; toc %'
Elapsed time is 0.039566 seconds.
似乎使用逻辑表示要慢得多(稀疏甚至更慢)。有人可以解释为什么吗?是类型转换时间吗?它是 CPU/FPU 指令集的限制吗?
编辑:我的系统是 Mac OS X 10.8.3 上的 MATLAB R2012b,Intel Core i7 3.4 GHz
EDIT2:一些评论表明,这只是 Mac OS X 的一个问题。如果可能的话,我想编译来自不同架构和操作系统的结果。
EDIT3:我的实际问题需要计算所有可能的长度二进制向量的很大一部分m
,其中m
可能太大而8 * m * 2^m
无法放入内存。