【发布时间】:2015-11-10 03:12:23
【问题描述】:
我有一个循环遍历一个矩阵并将只有一个非零元素的所有行和列设置为全零。
例如,它将转换这个矩阵:
A = [ 1 0 1 1
0 0 1 0
1 1 1 1
1 0 1 1 ]
到矩阵:
A' = [ 1 0 1 1
0 0 0 0
1 0 1 1
1 0 1 1 ]
A 的第 2 行/第 2 列只有 1 个非零元素,因此第 2 行/第 2 列的每个元素在A' 中都设置为 0
(假设矩阵总是对角对称的)
这是我的非矢量化代码:
for ii = 1:length(A)
if nnz(A(ii,:)) == 1
A(ii,:) = 0;
A(:,ii) = 0;
end
end
有没有更高效的方法在 MATLAB 中编写此代码?
编辑:
我在 cmets 中被要求澄清一下,所以我会答应的。
此代码的目的是从图中删除通向度数为 1 的顶点的边。
如果A 是表示无向图G 的邻接矩阵,则该矩阵中只有一个非零元素的行或列表示该行/列表示一阶顶点,因为它仅有一个边缘事件。
我的目标是从图中删除这些边,因为在我试图解决的问题的解决方案中永远不会访问这些顶点,并且缩小图也将减少我的搜索算法输入的大小。
@TimeString,我知道在您给出的示例中,将算法递归地应用于您的矩阵将导致矩阵为零,但是我将其应用于表示大型连接图的矩阵,因此永远不会有那样的情况。回答你关于为什么我只检查一行中有多少个元素,但清除列和行的问题;这是因为矩阵总是是对角对称的,所以我知道如果某件事对于一行是正确的,那么它将是相应的列..
所以,用另一个例子来澄清一下:
我要转这个图G:
用矩阵表示:
A = [ 0 1 1 0
1 0 1 0
1 1 0 1
0 0 1 0 ]
到这张图G':
由这个矩阵表示:
A' = [ 0 1 1 0
1 0 1 0
1 1 0 0
0 0 0 0 ]
(我意识到这个矩阵实际上应该是一个 3x3 矩阵,因为点 D 已被删除,但我已经知道在这种情况下如何缩小矩阵,我的问题是关于有效地设置只有 1 个非零的列/行元素全部为0)
我希望这是一个足够好的澄清..
【问题讨论】:
-
我觉得您的问题可能自相矛盾,而且您的解决方案并不能真正解决您提出的问题。 1) A = [1 1 0; 的预期答案是什么? 0 1 1; 0 0 1]?我认为递归我应该得到一个零矩阵。 2)在您的解决方案代码中,为什么您只检查一行中有多少个1,还要清除整个列?澄清一下?
-
知道了,这就是为什么你说 A 是对称的,我之前没有捕捉到
标签: matlab matrix vectorization