【发布时间】:2011-11-29 18:27:07
【问题描述】:
抱歉标题尴尬,这里是对问题的更具体描述。我有一个大的(例如 10^6 x 10^6)稀疏对称矩阵,它定义了节点之间的键。
例如矩阵A = [0 1 0 0 0; 1 0 0 2 3; 0 0 0 4 0; 0 2 4 0 5; 0 3 0 5 0] 将描述一个 5 节点系统,其中节点 1 和 2 通过键号 A(1,2) = 1 连接,节点 3 和 4 通过键号 A(3,4) = 4 连接,等等。
我想形成两个新矩阵。第一个 B 将列出连接到每个节点的节点(即 B 的每一行 i 具有由 find(A(i,:)) 给出的元素,并在必要时在末尾填充零),第二个 C 将列出连接到的键该节点(即 C 的每一行 i 都有由 nonzeros(A(i,:)) 给出的元素,必要时再次填充)。
例如对于上面的矩阵 A,我想形成 B = [2 0 0; 1 4 5; 4 0 0; 2 3 5; 2 4 0] 和 C = [1 0 0; 1 2 3; 4 0 0; 2 4 5; 3 5 0]
目前的代码是:
B=zeros(length(A), max(sum(spones(A))))
C=zeros(length(A), max(sum(spones(A))))
for i=1:length(A)
B(i,1:length(find(A(i,:)))) = find(A(i,:));
C(i,1:length(nonzeros(A(i,:)))) = nonzeros(A(i,:));
end
这可行,但对于大长度(A)来说很慢。我尝试过其他公式,但它们都包含 for 循环并且没有带来太大改进。
如何在不遍历行的情况下执行此操作?
【问题讨论】:
标签: matlab