将行和列设置为零

时间:2015-08-03 01:48:14

标签: algorithm matlab matrix

我正在Matlab中构建一个算法,该算法采用nm矩阵A实数,并在每个列和行中将条目设置为零A中至少有一个零条目。

练习明确要求我确保算法使用额外存储的n + m个变量(我真的不知道这意味着什么,所以解释会非常感激)并且我需要对算法的这种实现进行简要的复杂性分析,以便在f(n,m)An矩阵的情况下,它在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

2 个答案:

答案 0 :(得分:4)

我会给你一个机会为自己找到答案,但这里是你需要的程序大纲:

  • 找出哪些行中至少有一个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”的处理方式,但稍后我会解决这个问题。现在,请注意我已使用falsetrue来构建向量。这应该是下一步应该使用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步。

如果有任何错误,请纠正我!非常感谢所有想要帮助和参与的人!