2016-06-27 5 views
0

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 

에 쓴 것입니다 문제는 아직 명확하지 않은 경우 올려주세요.! 나는 때문에 내가이 방법을 시도 할 것이다 나의 평판의 부족으로 언급 할 수 있기 때문에

+0

'[10 7 8 4 1 6]에서'[0 0 0 0 0 0]'을 빼는 것은 어떻게 [8 1 4]'을 얻을 수 있습니까? 이것은 절대 의미가 없습니다. – excaza

+0

[10 7 8 4 1 6]의 매트릭스 A [2 6 4 3 5 1]에서 1의 자리에 [8 1 4]를 표시하고 1은 3 열 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 단계를 더 짧고 정확하게 정의 할 수 있습니까? 또는 중간 단계로 몇 가지 예를 들어 주시겠습니까?

+0

이것은 정확한 출력을 제공하지 않습니다! –

+0

이렇게하면 3 단계에서 설명한 벡터가 나타납니다. 직접 확인했습니다. –

+0

좀 더 설명해 드리겠습니다. 이제 우리는 행 사이의 최소 변경으로 1을 이동하려고합니다. 따라서 행 2의 경우 최소 변화가 어디에서 발생하는지 확인합니다. [8 1 4], [6] 및 [7,6]에서 변경 사항을 볼 수 있으므로 어느 숫자가 최소값인지 알 수 있습니다. 보시다시피 1입니다. 그래서 우리는이 작은 변화를 주었던 기둥에있는 B 행렬 1을 2 행으로 옮기겠습니까? 아직 질문이 있으시면 –