我有一个很大的稀疏矩阵,大约150,000 * 150,000。我需要访问其行,提取非零元素并按照规则替换这些值,如下面的代码:
H = [];
for i = 1: size(A,2)
[a,b,c] = find(A(i,:)); % extract the rows
if size(c,2)==1 % only 2
add = 0;
elseif size(c,2) > 1 && any(c<2)== 0 % many 2s
add = c;
add(1) = -2;
add(end) = 2;
add(2:end-1) = 0;
elseif size(c,2) > 1 && any(c<2)~= 0 % 2 and 1
k = find(diff(c)==-1); % find right 2 position
add = c;
add(1) = -1;
add(end) = -1;
add(k) = 2;
add(2:k-1) = 0;
add(k+1:end-1) = 0;
end
%add = diff([0 c(2:end) 0]); % the replacing rule
aa = i*ones(1,size(a,2)); % return back the old position of rows
G0 = [aa' b' add']; % put it back the old position with replaced values
H = [H; G0];
end
规则是
左图是从稀疏矩阵中提取的行的非零元素,我希望输出像右图一样。我刚刚选择了一些例子来解释规则。
我确实问了一个类似的问题here并得到了一个很好的答案。规则是行中2个相邻元素之间的差异,以便它可以集成到accumarray
函数中。但在这种情况下,规则有点不同,我不知道如何快速执行此任务。稀疏矩阵非常大,所以for
循环在这里做的很糟糕。
非常感谢。