Algorithm 将行和列设置为零
我正在Matlab中构建一个算法,该算法采用实数矩阵Algorithm 将行和列设置为零,algorithm,matlab,matrix,Algorithm,Matlab,Matrix,我正在Matlab中构建一个算法,该算法采用实数矩阵mA的n,并在原始A中至少有一个零条目时,将其每一列和行中的条目设置为零 练习明确要求我确保算法使用n+m个变量的额外存储(我真的不知道这意味着什么,因此非常感谢您的解释),我需要对算法的这个实现进行简要的复杂性分析,以便它在f(n,m)中完成每当A是n时,通过m矩阵执行步骤 我在网上浏览了一下,看看是否有人已经解决了这个问题,并且我遇到了一些Python代码,我试图在Matlab中进行调整。问题是,只要给定的矩阵有一个零,所有元素都被设置为零
m
A的n
,并在原始A
中至少有一个零条目时,将其每一列和行中的条目设置为零
练习明确要求我确保算法使用n+m个变量的额外存储(我真的不知道这意味着什么,因此非常感谢您的解释),我需要对算法的这个实现进行简要的复杂性分析,以便它在f(n,m)中完成
每当A
是n
时,通过m
矩阵执行步骤
我在网上浏览了一下,看看是否有人已经解决了这个问题,并且我遇到了一些Python代码,我试图在Matlab中进行调整。问题是,只要给定的矩阵有一个零,所有元素都被设置为零
A = [ 0 2 1; 4 1 6; 3 7 1; 1 3 1; 4 1 1];
m=size(A,1);
n=size(A,2);
row=false;
column=false;
for i = 1:m
if A(i,:) == 0
row=true;
break
end
end
for j = 1:n
if A(:,j) == 0
column=true;
break
end
end
for i = 1:m
for j = 1:n
if A(i,j) == 0
A(i,:)=0;
A(:,j)=0;
end
end
end
for i= 1:m
if A(i,:) == 0
for j=1:n
A(i,j)=0;
end
end
end
for j=1:n
if A(:,j) == 0
for i=1:m
A(i,j) = 0;
end
end
end
if row == true
for i=1:m
A(i,:)=0;
end
end
if column == true
for j=1:n
A(:,j)=0;
end
end
我会给你一个机会,让你自己找出答案,但以下是你需要的课程大纲:
- 找出哪些行中已经至少有一个0
- 这将存储在包含m元素的向量中
- 找出哪些列中已经至少有一个0
- 这将存储在包含n元素的向量中
- 现在,将上面标识的行和列归零
- 在确定哪些列已经有零之前,您不希望将行归零,因为如果您这样做,所有的都将有零!(假设矩阵中至少有一个零。)
O(n+m)
空间的变量中,您的计算就可以使用任意多的空间(这会有点奇怪)。对这一点进行一些澄清会有所帮助
如何查找至少包含一个零的行/列: 这是使用双循环实现的最简单的方法。我会在有更多时间的时候添加更多的讨论
[m, n] = size(A);
rowsWithZero=false(1,m);
colsWithZero=false(1,n);
for ii=1:m
for jj=1:n
if A(ii,jj) == 0
%// Row ii, Col jj has a zero... mark it in the vectors
rowsWithZero(ii) = true;
colsWithZero(jj) = true;
end
end
end
使用
for
循环访问矩阵元素并不是最“Matlab”的方法这样做的方式,但我稍后会解决这个问题。现在,请注意,我已经使用了false
和true
来构建向量。这应该是下一步应该使用逻辑索引的线索,我会给你一个为自己找到答案的机会,但这里是你需要的程序的概要:
- 找出哪些行中已经至少有一个0
- 这将存储在包含m元素的向量中
- 找出哪些列中已经至少有一个0
- 这将存储在包含n元素的向量中
- 现在,将上面标识的行和列归零
- 在确定哪些列已经有零之前,您不希望将行归零,因为如果您这样做,所有的都将有零!(假设矩阵中至少有一个零)
带有m和n元素的两个向量是获得m+n附加空间的地方
注意:奇怪的措辞“n+m变量的额外存储”可能只是指“O(n+m)额外空间”(这很正常),也可能意味着只要将结果存储在不超过O(n+m)
空间的变量中,您的计算就可以使用任意多的空间(这会有点奇怪)。对这一点进行一些澄清会有所帮助
如何查找至少包含一个零的行/列:
这是使用双循环实现的最简单的方法。我会在有更多时间的时候添加更多的讨论
[m, n] = size(A);
rowsWithZero=false(1,m);
colsWithZero=false(1,n);
for ii=1:m
for jj=1:n
if A(ii,jj) == 0
%// Row ii, Col jj has a zero... mark it in the vectors
rowsWithZero(ii) = true;
colsWithZero(jj) = true;
end
end
end
使用for
循环访问矩阵元素并不是最“Matlab”的方法这样做的方式,但我稍后会解决这个问题。现在,请注意,我已经使用了false
和true
来构建向量。这应该是下一步应该使用逻辑索引
Ok Bicker的线索,多亏了您的提示,我终于编写出了工作代码!这里是:
[m, n] = size(A);
rowsWithZero = false(1,m);
colsWithZero = false(1,n);
for ii=1:m
for jj=1:n
if A(ii,jj) == 0
rowsWithZero(ii) = true;
colsWithZero(jj) = true;
end
end
end
for ii = 1:numel(rowsWithZero)
if rowsWithZero(ii) == true
A(ii,:)=0;
end
end
for jj = 1:numel(colsWithZero)
if colsWithZero(jj) == true
A(:,jj)=0;
end
end
现在,为了讨论算法的复杂性,我将在稍后进行更新。此外,我还提出了一些更“面向Matlab”的代码,用更少的行来解决问题:
[r,c] = find(A==0);
for i = 1:numel(r)
A(r(i),:)=0;
end
for j = 1:numel(c)
A(:,c(j))=0;
end
但是在第二种情况下,我们不知道函数find
完成搜索的步骤有多少,因此进行适当的复杂性分析有点困难
但是我认为使用逻辑索引的算法应该在最坏的情况下,在m*n+m+n步中完成
如果有任何错误,请纠正我!非常感谢所有想要帮助和参与的人!好的比克,感谢您的提示,我终于编写了工作代码!这里是:
[m, n] = size(A);
rowsWithZero = false(1,m);
colsWithZero = false(1,n);
for ii=1:m
for jj=1:n
if A(ii,jj) == 0
rowsWithZero(ii) = true;
colsWithZero(jj) = true;
end
end
end
for ii = 1:numel(rowsWithZero)
if rowsWithZero(ii) == true
A(ii,:)=0;
end
end
for jj = 1:numel(colsWithZero)
if colsWithZero(jj) == true
A(:,jj)=0;
end
end
现在,为了讨论算法的复杂性,我将在稍后进行更新。此外,我还提出了一些更“面向Matlab”的代码,用更少的行来解决问题:
[r,c] = find(A==0);
for i = 1:numel(r)
A(r(i),:)=0;
end
for j = 1:numel(c)
A(:,c(j))=0;
end
但是在第二种情况下,我们不知道函数find
完成搜索的步骤有多少,因此进行适当的复杂性分析有点困难
但是我认为使用逻辑索引的算法应该在最坏的情况下,在m*n+m+n步中完成
如果有什么问题,请纠正我!非常感谢所有愿意帮助和参与的人