2014-11-29 2 views
0

Matlab의 두 불균등 행렬을 비교하고이 행을 추출하여 다른 행렬에 저장하십시오 (예 : D). 예를 들어,Matlab의 불균일 행렬 값 비교

tmp = [2245; 2345; 2290; 4576] 

id=[1 2245 564 8890 123; 
    2 2445 5673 7846 342; 
    3 2290 3428 3321 908]. 

ID는 더 큰 행렬이다. 'id'에있는 tmp의 각 값을 찾으려고합니다. 아래 라인에있는 intersect 명령을 사용하여 tmp의 값을 포함하는 id 행을 찾을 수 있었지만, tmp의 각 값이 여러 번 반복 될 때마다 하나씩 tmp의 각 값에 대해 이렇게하고 싶습니다. 신분증. 나는 foreach를 사용해 보았습니다. 그러나 foreach는 char 유형 배열에 사용할 수 없다는 오류 메시지가 나타납니다. 아무도 이것에 대해 갈 방법을 제안 할 수 있을까요?

for j=1:length(tmp); 
[D,itmp,id2] = intersect(tmp(j,1),id(:,2), 'rows'); 

루프를 사용 했음에도 불구하고 코드는 한 번에 하나의 값을 취하지 않습니다. 이것이 'foreach j'를 시도한 이유입니다. 또한 두 행렬에 공통적 인 행을 찾아 D에 저장 한 후에 행렬 id를 추가하여 id 내의 관련 행 옆에 j 값을 포함시키고 싶습니다. 예를 들어, tmp 내의 첫 번째 값이 행 1,3,5,10에서 id로 반복되는 경우, 나는 ID 1,3,5,10 행 옆에있는 값 1을 취할 수있는 ID 열을 원합니다. 이것에 대한 도움이 많이 감사 할 것입니다! 감사.

답변

0

확실하지 정확하게, 당신이해야 할 노력하고 무엇을,하지만 당신은 find을 사용할 수있는 매트릭스에 값을 검색하려면 : 쉽게 bsxfunpermute의 조합을 사용하여이를 달성 할 수

for i = 1:numel(tmp)   
    [row, col] = find(id == tmp(i));    
    end 
0

. tmp 벡터를 단일 3D 벡터로 변형 한 다음 eq (같음) 함수를 사용하고 행렬에서 각 값이 tmp과 같은지 확인합니다. 이것은 내가 tmp3에 저장 내 최종 출력을 위해 무엇을 얻을

%// Your data 
id=[1 2245 564 8890 123; 
2 2445 5673 7846 342; 
3 2290 3428 3321 908] 
tmp = [2245; 2345; 2290; 4576]; 

tmp2 = permute(tmp, [3 2 1]); %// Make a 3D vector 
tmp3 = bsxfun(@eq, id, tmp2); %// Find which locations of id are equal to each value of tmp 

: 따라서, 같은 일을 할 당신이 여기에서 볼 수 있듯이

tmp3(:,:,1) = 

    0  1  0  0  0 
    0  0  0  0  0 
    0  0  0  0  0 


tmp3(:,:,2) = 

    0  0  0  0  0 
    0  0  0  0  0 
    0  0  0  0  0 


tmp3(:,:,3) = 

    0  0  0  0  0 
    0  0  0  0  0 
    0  1  0  0  0 


tmp3(:,:,4) = 

    0  0  0  0  0 
    0  0  0  0  0 
    0  0  0  0  0 

, 각 3D 슬라이스를 알 수있는 요소 id의 값은 tmp의 해당 값과 일치합니다. 따라서 첫 번째 슬라이스는 id의 요소가 tmp(1) 인 2245인지 여부를 알려줍니다.이 경우 첫 번째 행과 두 번째 열이됩니다. 두 번째 슬라이스의 경우 tmp(2) = 2345과 일치하는 값이 없습니다. 세 번째 슬라이스를 들어, id에서 하나 개의 값은 당신이 정말로 후 행과 tmp의 각 값이 id 각각의 위치를 ​​일치하는 곳의 열을 결정하는하는지, 3.

이제 3 행, 열 인 tmp(3) = 2290 일치. 너는 id 숫자로 묘사되기를 원한다. cols 우리가 일치 할 수 있었다 id에있는 행과 열을 알려줍니다,

[rows, cols, ID] = ind2sub(size(tmp3), find(tmp3)) 

rows = 

    1 
    3 


cols = 

    2 
    2 


ID = 

    1 
    3 

따라서, ID 우리가 일치하고, rows이있는 id 알려줍니다 : 그것은 쉽게이 행렬에 ind2subfind을 사용하여 수행 할 수 있습니다 .따라서 id = 1의 경우 tmp(1)= 2245과 일치하는 것을 발견했으며 row=1,col=2에 있습니다. 마찬가지로 id = 3의 경우 tmp(3)=2290과 일치하는 것을 발견했으며 이는 row=3,col=2입니다.

원하는 모든 정보가 포함 된 하나의 큰 2D 행렬로 만들려면 이러한 모든 열을 하나의 행렬로 간단하게 연결할 수 있습니다. 따라서 :

final = [ID rows cols] 

final = 

    1  1  2 
    3  3  2 

당신과 같이이 읽을 수 있습니다 tmp(1) = 2245

  • id=1, 우리는 row=1,col=2에서이 값을 발견했다. tmp(3) = 2290
  • id=3
  • , 우리는 row=3,col=2이 도움이

희망이 값을 발견!