首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取稀疏矩阵每列中所有非零元素的乘积

取稀疏矩阵每列中所有非零元素的乘积
EN

Stack Overflow用户
提问于 2013-04-07 09:19:01
回答 2查看 1.7K关注 0票数 2

在octave (或matlab) (返回乘积的行向量)中,有没有一种很好的矢量化方法来取稀疏矩阵每列中所有非零元素的乘积?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-07 09:28:22

我把findaccumarray结合起来

代码语言:javascript
复制
%# 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)

一些替代方案(这可能效率较低;您可能想要分析它们)

代码语言:javascript
复制
%# simply set the zero-elements to 1, then apply prod
%# may lead to memory issues
s(s==0) = 1;
product = prod(s,1);

代码语言:javascript
复制
%# 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
票数 4
EN

Stack Overflow用户

发布于 2013-04-10 04:57:06

我找到了另一种方法来解决这个问题,但它可能会更慢,在最坏的情况下也不是很精确:

只需取所有非零元素的对数,然后对列求和即可。然后取结果向量的exp:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15857858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档