[英]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
因此,对于行i
的B
,相应的行i
的A
必须满零除外A(i,B(i,1))=1
和A(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.