移动1的位置

时间:2016-06-27 19:17:13

标签: matlab loops matrix minimum subtraction

我有2个矩阵。矩阵A已经定义。

  Matrix A = [10 7 8 4 1 6;
              2 6 4 3 5 1;
              7 3 2 2 8 7;
              6 2 3 10 11 4;
              1 5 1 2 4 5]

 Matrix B =  [1 1 1 0 0 0;
              0 0 0 0 0 0;
              0 0 0 0 0 1;
              0 0 0 1 1 0;
              0 0 0 0 0 0]

这里每行必须至少有一个'1'。这是我们的主要目标,所以如果有一行没有1,我们将不得不从另一行移动'1'。

我们如何移动1?

1)检查哪些行都是零。在此示例中,第2行和第5行。

2)我们将用矩阵A中包含1的所有其他行减去这2行。这意味着矩阵A中的第2行和第5行将被所有其他行减去。

3)减法后,我们将检查每1个减去的行之间的变化,在1的位置。 例如:

从第1行减去第2行(全部为零)将为我们提供此[8 1 4]

从第1行减去第5行(全部为零)将为我们提供[9 2 7]

从第3行减去第2行(全部为零)将为我们提供此[6]

从第3行减去第5行(全部为零)将为我们提供此[2]

从第4行减去第2行(全部为零)将为我们提供此[7 6]

从第4行减去第5行(全零)会给我们[8 7] ..

4)在1的位置,我们将检查行之间的变化并查看最小变化。满足最小变化的列,我们将1放在原位并将其从旧位置移除。

例如: 对于第2行,我们将看到最小变化的位置。这里第2行的最小更改为1,即第1行。因此,我们将删除此列中的1,并将其移至第2行中的同一列。

                         [1 0 1 0 0 0;
                          0 1 0 0 0 0;
                          0 0 0 0 0 1;
                          0 0 0 1 1 0;
                          0 0 0 0 0 0]

从第1行减去第5行(全部为零)将为我们提供[8 4]

从第3行减去第5行(全部为零)将为我们提供此[2]

从第4行减去第5行(全零)将为我们提供[8 7] .. 第5行也一样,检查最小变化。这里它是2,但它是数组中唯一一个在第3行。因此,对于这种情况,我们想要添加一个条件,我们不做减法方法,除非行中有两个或更多。所以我们将移动到另一个最小变化,这里是4,这是从第1行的变化所以将删除第1行中的1并将其放入第5行

所以输出将是=

                         [1 0 0 0 0 0;
                          0 1 0 0 0 0;
                          0 0 0 0 0 1;
                          0 0 0 1 1 0;
                          0 0 1 0 0 0]

现在满足条件,每行至少有一个1.

这是我在代码中写的

%search for zero-rows in matrix B
minim = max(A) % Set the minimum value as an initial solution
zeroRows = find(sum(B,2)==0);
nonZeroRows = find(sum(B,2)~=0);
x = [];
y = [];

 for zi = zeroRows'
  for nZi = nonZeroRows'


       %gives row vector of A with elements, where corresponding  B elements are 1
       %this row nZi in B is not zero
       nonZeroRow  = A(nZi,B(nZi,:) ==1);
       nonZeroFull  = A(nZi,:)

       %gives row vector of A with elements, where corresponding  B elements are 1
       %this row zi in B is zero
       zeroRow  =A(zi, B(nZi,:) == 1);
       zeroFull  = A(zi,:)

       %calculate the distance
       disp(strcat('row ',num2str(nZi), ' - row ', num2str(zi)))
      change =  abs(nonZeroRow - zeroRow)
      changeFull = nonZeroFull - zeroFull
   x = [x change]
   y = [y;changeFull]
  Minimumchange = min(x)
   if(Minimumchange < minim)
       minim = Minimumchange

   intersection =  intersect(y,minim)
for i = 1 : length(intersection)
    [w Index_intersection] = find(y == intersection(i))

    B(zi,Index_intersection) = 0
    B(nZi,Index_intersection) = 1
end 
   end 
   end    
end

这是到目前为止的代码,但它没有给出正确的输出

问我问题是否仍然不明确。!

1 个答案:

答案 0 :(得分:0)

由于缺乏声誉我无法发表评论,我会以这种方式尝试...... 这将是你的步骤1,2和3:

A = [10 7 8 4 1 6;
    2 6 4 3 5 1;
    7 3 2 2 8 7;
    6 2 3 10 11 4;
    1 5 1 2 4 5];

B =  [1 1 1 0 0 0;
    0 0 0 0 0 0;
    0 0 0 0 0 1;
    0 0 0 1 1 0;
    0 0 0 0 0 0];

%search for zero-rows in matrix B
zeroRows = find(sum(B,2)==0);
nonZeroRows = find(sum(B,2)~=0);

for nZi = nonZeroRows'
   for zi = zeroRows'

       %gives row vector of A with elements, where corresponding  B elements are 1
       %this row nZi in B is not zero
       nonZeroRow  = A(nZi,B(nZi,:) ==1);

       %gives row vector of A with elements, where corresponding  B elements are 1
       %this row zi in B is zero
       zeroRow  =A(zi, B(nZi,:) == 1);

       %calculate the distance
       disp(strcat('row ',num2str(nZi), ' - row ', num2str(zi)))
       abs(nonZeroRow - zeroRow)
   end    
end

但是,我不明白你在第4步中的意思。你能否更精确地制定你的第4步?或者给出一些中间步骤的例子?