我有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
这是到目前为止的代码,但它没有给出正确的输出
问我问题是否仍然不明确。!
答案 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步?或者给出一些中间步骤的例子?