【问题标题】:Matlab:Efficient assignment of values in a sparse matrixMatlab:稀疏矩阵中值的有效分配
【发布时间】:2014-09-29 21:36:07
【问题描述】:

我在 Matlab 中工作,我遇到了下一个问题: 我有一个由nx2 元素组成的B 矩阵,其中包含分配大稀疏矩阵A(几乎是500,000x80,000)的索引。对于B 的每一行,第一列是A 的列索引,必须包含1,第二列是A 的列索引,必须包含-1。 例如:

B=  1   3
    2   5
    1   5
    4   1
    5   2

对于这个 B 矩阵,对应的 A 矩阵必须是这样的:

A= 1    0   -1    0    0
   0    1    0    0   -1
   1    0    0    0   -1
  -1    0    0    1    0
   0   -1    0    0    1

因此,对于Bi 行,A 的相应行i 必须全为零,A(i,B(i,1))=1A(i,B(i,2))=-1 除外

在 B 的所有行上使用 for 循环非常容易,但速度非常慢。我还尝试了下一个公式:

A(:,B(:,1))=1
A(:,B(:,2))=-1

但是 matlab 给了我一个“内存不足错误”。如果有人知道实现此目标的更有效方法,请告诉我。

提前致谢!

【问题讨论】:

  • 您的代码用 1 或 -1 填充整列。这就是你内存不足的原因(结果不会是你想要的)

标签: matlab matrix


【解决方案1】:

你可以使用sparse函数:

m = size(B,1); %// number of rows of A. Or choose larger if needed
n = max(B(:)); %// number of columns of A. Or choose larger if needed
s = size(B,1);
A = sparse(1:s, B(:,1), 1, m, n) + sparse(1:s, B(:,2), -1, m, n); 

【讨论】:

    【解决方案2】:

    我认为您应该能够使用sub2ind 函数来执行此操作。此函数将矩阵下标转换为线性索引。你应该可以这样做:

    pind = sub2ind(size(A),1:n,B(:,1)); % positive indices
    nind = sub2ind(size(A),1:n,B(:,2)); % negative indices
    A(pind) = 1;
    A(nind) = -1;
    

    编辑:我(我认为是错误的)假设稀疏矩阵 A 已经存在。如果不存在,那么这个方法就不是最好的选择了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 2018-08-07
      • 2015-04-22
      • 2012-04-02
      • 1970-01-01
      • 2017-07-02
      相关资源
      最近更新 更多