Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 将行和列设置为零_Algorithm_Matlab_Matrix - Fatal编程技术网

Algorithm 将行和列设置为零

Algorithm 将行和列设置为零,algorithm,matlab,matrix,Algorithm,Matlab,Matrix,我正在Matlab中构建一个算法,该算法采用实数矩阵mA的n,并在原始A中至少有一个零条目时,将其每一列和行中的条目设置为零 练习明确要求我确保算法使用n+m个变量的额外存储(我真的不知道这意味着什么,因此非常感谢您的解释),我需要对算法的这个实现进行简要的复杂性分析,以便它在f(n,m)中完成每当A是n时,通过m矩阵执行步骤 我在网上浏览了一下,看看是否有人已经解决了这个问题,并且我遇到了一些Python代码,我试图在Matlab中进行调整。问题是,只要给定的矩阵有一个零,所有元素都被设置为零

我正在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元素的向量中
  • 现在,将上面标识的行和列归零

    • 在确定哪些列已经有零之前,您不希望将行归零,因为如果您这样做,所有的都将有零!(假设矩阵中至少有一个零。)
带有mn元素的两个向量是获得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
来构建向量。这应该是下一步应该使用
逻辑索引的线索,我会给你一个为自己找到答案的机会,但这里是你需要的程序的概要:

  • 找出哪些行中已经至少有一个0

    • 这将存储在包含m元素的向量中
  • 找出哪些列中已经至少有一个0

    • 这将存储在包含n元素的向量中
  • 现在,将上面标识的行和列归零

    • 在确定哪些列已经有零之前,您不希望将行归零,因为如果您这样做,所有的都将有零!(假设矩阵中至少有一个零)
带有mn元素的两个向量是获得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步中完成

如果有什么问题,请纠正我!非常感谢所有愿意帮助和参与的人