[英]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.