【问题标题】:sparse matrix values as indexes to another matrix稀疏矩阵值作为另一个矩阵的索引
【发布时间】:2015-04-16 10:11:28
【问题描述】:

S - NxN 稀疏矩阵。
A - Mx1 向量。

S 的非零值是A 的索引。
我想计算一个向量x 使得在xi'th 条目中:
对于Si'th 行中的每个非零值j,取A[j] 并计算所有这些j 的总和并将其放入@ 的i'th 条目中987654337@.

在伪中应该是这样的:

  for i = 1:N
     for j = 1:N
        if( s[i][j] != 0)
           x[i] += s[ A[i,j] ]

如何在 ma​​tlab 中以最高效的方式做到这一点?

【问题讨论】:

  • 可能应该有另一个增量?像 x[i] += A[s[i][j]]?

标签: matlab matlab-figure matlab-engine


【解决方案1】:

让我们尝试使用findaccumarray

[ii jj sij] = find( S );
x = accumarray( ii, A(sij), [1 size(S,1)] );

【讨论】:

  • 它认为你需要x = accumarray( ii, A(jj), [size(S,1), 1] ).';
  • 嗨,A 来自维度 Mx1,S 是 NxN,我的意思是 A(jj) 不正确我需要采取 A[S[i][j]]
  • 这对我来说很好用:x = accumarray( ii, A(nonzeros(S)), [size(S,1), 1] )。谢谢你们
【解决方案2】:

这只是矩阵乘法:

x = (S~=0)*A(1:size(S,2));

Matlab 对稀疏矩阵有效地进行矩阵乘法,所以这应该很快。

【讨论】:

  • 如果numel(A)<size(S,2)怎么办?
  • @Shai 我不知道。在这种情况下,问题是未指定的。 OP 应该表明他们想要什么。在那种情况下,他们的代码也会失败,你的也会失败(即使我更正了)。
  • 但正如我所说:S - NxN 稀疏矩阵。 A - Mx1 向量。当M不一定等于N
  • @user3175582 但是M必须大于等于N,否则问题未定义
【解决方案3】:

这实际上就像 Shai 的答案,但使用 nonzeros(S) 代替 sij:

[ii jj] = find( S );
x = accumarray( ii, A(nonzeros(S)), [size(S,1), 1] ).' 

【讨论】:

  • 这本质上是Shai's answer。您应该接受该答案(特别是如果 Shai 做出更正)而不是发布您自己的答案
猜你喜欢
  • 1970-01-01
  • 2018-01-19
  • 2018-05-06
  • 1970-01-01
  • 2012-01-15
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
相关资源
最近更新 更多