Matlab:稀疏矩阵中的有效赋值
我在Matlab中工作,我有下一个问题: 我有一个由Matlab:稀疏矩阵中的有效赋值,matlab,matrix,Matlab,Matrix,我在Matlab中工作,我有下一个问题: 我有一个由nx2元素组成的B矩阵,其中包含分配大型稀疏矩阵a(大约500000x80000)的索引。对于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
nx2
元素组成的B
矩阵,其中包含分配大型稀疏矩阵a
(大约500000x80000)的索引。对于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
因此,对于B
的行i
,A
的对应行i
必须充满零,除了A(i,B(i,1))=1和A(i,B(i,2))=-1
这是非常容易的for
循环覆盖所有B行,但速度非常慢。我还尝试了下一个公式:
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
已经存在。如果不存在,则此方法不是最佳选择。您可以使用以下功能:
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);
代码用1或-1填充整个列。这就是内存不足的原因(结果无论如何都不是你想要的)