【发布时间】:2013-04-07 01:19:00
【问题描述】:
是否有一种很好的矢量化方法来获取八度(或 matlab)中稀疏矩阵每一列中所有非零元素的乘积(返回乘积的行向量)?
【问题讨论】:
标签: matlab octave vectorization sparse-matrix multiplication
是否有一种很好的矢量化方法来获取八度(或 matlab)中稀疏矩阵每一列中所有非零元素的乘积(返回乘积的行向量)?
【问题讨论】:
标签: matlab octave vectorization sparse-matrix multiplication
我会将find 与accumarray 结合起来:
%# create a random sparse array
s = sprand(4,4,0.6);
%# find the nonzero values
[rowIdx,colIdx,values] = find(s);
%# calculate product
product = accumarray(colIdx,values,[],@prod)
一些替代方案(可能效率较低;您可能想要对它们进行概要分析)
%# simply set the zero-elements to 1, then apply prod
%# may lead to memory issues
s(s==0) = 1;
product = prod(s,1);
.
%# do "manual" accumarray
[rowIdx,colIdx,values] = find(s);
product = zeros(1,size(s,2));
uCols = unique(colIdx);
for col = uCols(:)'
product(col) = prod(values(colIdx==col));
end
【讨论】:
accumarray 的@prod 参数——这就是accumarray 知道将哪个函数应用于数组的方式。这是典型的预期语法。为什么要避免它?
我找到了解决此问题的另一种方法,但在最坏的情况下它可能会更慢且不够精确:
只需记录所有非零元素的对数,然后对各列求和。然后取结果向量的exp:
function [r] = prodnz(m)
nzinds = find(m != 0);
vals = full(m(nzinds));
vals = log(vals);
m(nzinds) = vals;
s = full(sum(m));
r = exp(s);
endfunction
【讨论】: