2014-10-25 2 views
0

matlab를 처음 사용했습니다. 나는 배열을 가지고 있는데, 행렬에 min 요소를 찾고 행렬의 해당 행과 열을 1로 만듭니다. 첫 번째 루프에서는 완벽하게 작동하지만 다음 루프에서는 행렬이 업데이트되지 않습니다.Matlab : 루프에서 업데이트되지 않는 행렬

코드 :

data=[1.00000000 0.53137106 0.85595882 0.66829640 0.23856533 0.45405844 0.54347968 0.56774586 0.23837982 0.62409687; 
0.53137106 1.00000000 0.28491443 0.83557534 0.58327866 0.53124779 0.18295255 0.30800611 0.88819402 0.82852000 ; 
0.85595882 0.28491443 1.00000000 0.88712496 0.53283900 0.93776625 0.18187943 0.25401449 0.46880579 0.86628407 ; 
0.66829640 0.83557534 0.88712496 1.00000000 0.73516506 0.32148027 0.87524909 0.85505933 0.72357458 0.09848434 ; 
0.23856533 0.58327866 0.53283900 0.73516506 1.00000000 0.70343286 0.51693362 0.51673573 0.27955368 0.72713149 ; 
0.45405844 0.53124779 0.93776625 0.32148027 0.70343286 1.00000000 0.68939388 0.84967077 0.40466678 0.31867197 ; 
0.54347968 0.18295255 0.18187943 0.87524909 0.51693362 0.68939388 1.00000000 0.21098818 0.86957568 0.86703879 ; 
0.56774586 0.30800611 0.25401449 0.85505933 0.51673573 0.84967077 0.21098818 1.00000000 0.79130369 0.81940556 ; 
0.23837982 0.88819402 0.46880579 0.72357458 0.27955368 0.40466678 0.86957568 0.79130369 1.00000000 0.88794363 ; 
0.62409687 0.82852000 0.86628407 0.09848434 0.72713149 0.31867197 0.86703879 0.81940556 0.88794363 1.00000000 ]; 
ptr=1; 

for k= 1:9 
k 
%find min ele, its row and column no: 
[minNumRow, minIndexRow] = min(data); 
[minNum, row] = min(minNumRow); 
col = minIndexCol(row); 
row 
col 
minNum 
%storing it in cluster array 
cluster{ptr}={strcat(int2str(row),', ',int2str(col))}; 
ptr=ptr+1; 
%make eles of merged objects as 1 
    for i=1:10 
    data(row)=1; 
    row=row+10; 
    end 
    for i= ((col*10)-10): (col*10) 
    data(i)=1; 
    end 
data 
end 

도와주세요! 나는 바로 그것을 가지고있는 경우

+2

또한 데이터에서 최소값 (0.0985)이 두 번 존재 함을 유의하십시오. 주어진 답은 둘 다 셀 (10,4)에서 발생을 발견 할 뿐이지 만 (4,10)에도 있습니다. 당신도 그 일을 돌보고 싶습니까? 아니면 충분합니까? –

+0

@ SebastianHöffner, 좋은 지적입니다. 감사. – Rashid

+0

예 0.0985가 두 번 나타납니다. min 요소를 한 번만 찾고 두 번째 요소는 행/열을 행렬에서 제거해야합니다. – nikhilk

답변

0

는 잘 모르겠어요,하지만 난 당신이 필요하다고 생각

1의 값 분의 행과 열을 변경
data = randi(9, [5 5]); % put your data instead 
[colData, column] = min(data); 
[~, row] = min(colData); 
data(:,column(row)) = 1; 
data(row,:) = 1; 

.

+0

@nikhilk,이게 당신이 필요로 하는게 아닌가요? – Rashid

+0

'[~, ind] = min (min (Data))'는 행 인덱스 만 반환합니까? –

+0

[~, ind] = min (min (Data))이 행 색인을 반환했습니다. 나는 해당 칼럼을 1로 만들고 싶다. – nikhilk

0

루프가 필요하지 않습니다. 샘플 데이터를 기반으로

:

[~, linidx] = min(data(:)); % Returns linear index of minimum 
[row, col] = ind2sub(size(data),linidx); % Convert linear index to subscripts 

% Set row & column to 1 
data(row,:) = 1; 
data(:,col) = 1; 

자세한 내용은 linear indexingind2sub 설명서를 참조하십시오. 주로 :

MATLAB 저장 행렬과 배열이 아닌 MATLAB 명령 창에 표시 할 때이 을 표시 모양,하지만 요소의 하나의 열로.

에서 data(:)을 사용하여 우리가 얻은 결과는 우리의 최소값의 지수입니다.

편집 : 세바스찬이 위의 의견에서 지적한 것처럼 동일한 최소값이 여러 개인 경우이 메서드는 첫 번째 값의 위치 만 반환합니다. 이것은 min 함수의 고유 한 동작이므로 허용 오차 내에서 동일한 값 (floating point errors)을 찾고 필요에 따라 수정하는 자체 논리를 구현해야합니다.