【发布时间】:2015-05-11 01:23:16
【问题描述】:
我需要在Matlab中总结一个稠密向量和一个稀疏向量,以及简单的做法,即:
w = rand(1e7,1);
d = sprand(1e7,1,.001);
tic
for k = 1 : 100
w = w + d;
end
toc
大约需要 3.5 秒,这比我期望 Matlab 在后台实现它的方式慢了大约 20 倍:
for k = 1 : 100
ind = find(d);
w(ind) = w(ind) + d(ind);
end
(当然这个更快版本的时间取决于稀疏性)。
那么,为什么 Matlab 不采用“快速方式”呢?到目前为止,我使用 Matlab 的经验表明它非常擅长利用稀疏性。
更重要的是,是否还有其他我应该怀疑效率不高的“稀疏”操作?
【问题讨论】:
-
一些猜测:您的方法之所以有效,是因为等式两边都有
w;它不适用于x = w + d。也许 Matlab 根本没有实现用于识别稀疏累积的优化过程。 -
您是否测试过在单独的 m 文件中运行它?这对 JIT 可能很重要,在某些情况下,它足够聪明地找出
w = w + d是一个就地操作,而在命令行上它可能会创建一个新向量w,同时丢弃旧向量。 .. -
@OliverCharlesworth:您对实施的看法可能是正确的;但是我认为我的用例很常见,例如梯度下降更新规则。
-
@BasSwinckels:从 m 文件运行结果是一样的。
标签: matlab sparse-matrix