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

我在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    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填充整个列。这就是内存不足的原因(结果无论如何都不是你想要的)