2 개의 행렬이 있습니다. 행렬 A가 이미 정의되어 있습니다.1의 자리로 이동
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) 모두 0 인 행을 확인하십시오. 이 예에서 행 2와 5입니다.
2) 행렬 A의 1을 포함하는 다른 모든 행과 함께이 2 행을 뺍니다. 즉 행렬 A의 행 2와 행 5가 다른 모든 행에 의해 감산됨을 의미합니다 행.
3) 빼기 후에는 1의 위치에서 빼기 2 행 사이의 변화를 확인합니다. 예 :
감산 2 행 (모두 제로)의 1 행에서 우리에게 제공한다 본 [8 1 4]
및
1 행에서 5 행 (모두 0)이 감산 우리 [9 2 7]
줄 것이다.
감산 2 행 우리에게 제공 할 열 3 행 (모두 제로)이 [6]
및
감산 5 행 우리에게 [2]
감산 2 행 (모두 0)을 수득한다 행 3 행 (모두 제로) 행 4에서 우리에게 제공한다 본 [7 6]
와
감산 5 행 1의 위치에있는 US이 [8 7]
를 제공 행 4 행 (모두 제로) ..
4) 행 사이의 변경 사항을 확인하고 최소 변경 사항을 확인합니다. 최소 변경을 만족시키는 열, 1을 그 자리에두고 이전 위치에서 제거합니다.
예 : 여기행 2의 경우 최소 변경 사항을 확인합니다. 여기에 2 행의 최소 변화 그래서 우리는이 칼럼의 하나를 제거하고, 행에 동일한 열에 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]
감산 5 행 (모두 0으로 이동 1 행에있는 1이었다) 1 행에서 우리에게 이것을 줄 것이다 [8 4]
.
감산 행 5 우리에게 제공 할 열 3 행 (모두 제로)이 [2]
4 행에서 5 행 (모두 제로)을 감산하여 최소값을 확인 우리에게 [8 7]
.. 5 행에 동일한 줄 것 변화. 여기서는 2이지만 행 3에있는 배열의 유일한 배열입니다. 따라서이 경우에는 행에 2가 1 이상인 경우를 제외하고는 빼기 방법을 사용하지 않는 조건을 추가하려고합니다. 그래서 우리는 = 여기 때문에 1 행에서 1을 제거하고, 그래서 여기에 출력 될 것이다
행 5를 넣어 1 행에서 변화되는 4 다른 최소 변화 이동
[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
에 쓴 것입니다 문제는 아직 명확하지 않은 경우 올려주세요.! 나는 때문에 내가이 방법을 시도 할 것이다 나의 평판의 부족으로 언급 할 수 있기 때문에
'[10 7 8 4 1 6]에서'[0 0 0 0 0 0]'을 빼는 것은 어떻게 [8 1 4]'을 얻을 수 있습니까? 이것은 절대 의미가 없습니다. – excaza
[10 7 8 4 1 6]의 매트릭스 A [2 6 4 3 5 1]에서 1의 자리에 [8 1 4]를 표시하고 1은 3 열 1에 있습니다. –
너처럼 보입니다. 작업을 수행하는 방법을 매우 자세하게 설명해야합니다. 코드를 작성하는 데 문제가 있습니까? 그렇다면 지금까지 작성한 내용을 질문에 포함시켜야합니다. –