繁体   English   中英

Matlab:有效地分配稀疏矩阵中的值

[英]Matlab:Efficient assignment of values in a sparse matrix

我正在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

因此,对于行iB ,相应的行iA必须满零除外A(i,B(i,1))=1A(i,B(i,2))=-1

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

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

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

提前致谢!

我认为您应该能够使用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已经存在。 如果不存在,则此方法不是最佳选择。

您可以使用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); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM