【发布时间】:2013-05-07 18:59:49
【问题描述】:
我有 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:一些 cmets 表明,这只是 Mac OS X 的一个问题。如果可能的话,我想编译来自不同架构和操作系统的结果。
EDIT3:我的实际问题需要计算所有可能的长度为m 的二进制向量的很大一部分,其中m 可能太大而8 * m * 2^m 无法放入内存。
【问题讨论】:
-
我认为这与 MATLAB 在乘以
A之前隐式转换logical为double的事实有关。 -
这里的时间不同:
0.161891 / 0.057331 / 0.049061秒。 -
R2013a Vista32 Intel Core Duo T9300:
0.216960 / 0.026960 / 0.081925秒。 -
我可以用一个非常相似的系统 (
0.018691 / 0.025646 / 0.036361) 确认您的时间安排:Matlab R2012b、Mac OS X 10.8.3、Intel Core i7 (Retina MBP)。我已经多次看到这个确切的问题,并且长期以来一直怀疑 Matlab 在优化 OS X 中的逻辑计算方面做得不好。天真的事情是 Matlab 将数据重新转换为更高级别的双精度,Matlab 的本机格式,但是显然有更聪明的方案。在某些情况下,函数double可用于在计算之前手动重铸部分或全部逻辑数据 - 在上面的简单示例中,这将无济于事。 -
您可能还想向 The MathWorks 提交 bug report / service request 并引用此页面。
标签: performance matlab types floating-point matrix-multiplication