我正在Matlab中构建一个算法,该算法采用n
个m
矩阵A
实数,并在每个列和行中将条目设置为零A
中至少有一个零条目。
练习明确要求我确保算法使用额外存储的n + m个变量(我真的不知道这意味着什么,所以解释会非常感激)并且我需要对算法的这种实现进行简要的复杂性分析,以便在f(n,m)
为A
到n
矩阵的情况下,它在m
步骤中完成。
我已经在网上浏览了一下是否有人已经解决了这个问题,而且我已经遇到了一些我试图在Matlab中适应的Python代码。问题是,只要给定矩阵有一个零,所有元素都设置为零。
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 :(得分:4)
我会给你一个机会为自己找到答案,但这里是你需要的程序大纲:
找出哪些行中至少有一个0
找出哪些列已经包含至少一个0
现在,将上面标识的行和列清零
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
来构建向量。这应该是下一步应该使用logical indexing
的线索。
答案 1 :(得分:0)
[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
现在我稍后会更新以讨论算法的复杂性。此外,我想出了一些更“面向Matlab”的代码,用更少的行来解决问题:
find
但在第二种情况下,我们并不知道函数glGenBuffers
完成搜索的步数有多少,而且进行适当的复杂性分析有点困难。
但我认为使用逻辑索引的算法应该在最坏的情况下完成m * n + m + n步。
如果有任何错误,请纠正我!非常感谢所有想要帮助和参与的人!