2013-06-17 2 views
3

2 개의 2 차원 행렬 A, B가 있습니다. 여기서 B는 A의 (행 순) 순열에 의해 생성됩니다. 몇 개의 반복 레코드가 있습니다. A에서 (그리고 B에서). B를 생성 한 매핑을 찾고 싶습니다. Matlab을 사용하고 있습니다. 오직 하나의 솔루션만으로 충분합니다.Matlab에서 2-d 행렬의 순열 이후에 매핑을 찾는 방법

예 : 매핑 될

A = [ 2 3 4; 4 5 6; 2 3 4]; 
B = [ 4 5 6; 2 3 4; 2 3 4]; 

:

p = [3 1 2] // I want this mapping, however the solution p= [2 1 3] is also correct and acceptable 

매트랩 여기서 A = B (p :). // 편집 됨

감사합니다.

+0

어떻게'B'를 priduce 했습니까? – Shai

+0

나 자신이 B를 생산하지 않지만 A에서 레코드를 치환하여 생산된다는 것을 알고있다. – remo

+0

순열 방식에 대한 액세스 권한이 있는가? – Shai

답변

2

낮은 매달린 과일이 먼저 나옵니다.

중복이있는 경우, 우리는 행에 "관계를 중단"할 필요가
% compute the permutation matrix 
P = all(bsxfun(@eq, permute(A, [1 3 2]),permute(B,[3 1 2])), 3); 
[~, p] = max(P, [], 2); % gives you what you want 

/P의 열 :
중복 행이없는 가정

n = size(A,1); 
bt = abs(bsxfun(@minus, 1:n, (1:n)'))/n; %//' 
[~, p] = max(P+bt, [], 2); 
+0

+1 : 좋은 해결책. 또한 부동 소수점 값의 경우 허용 오차를 사용하는 것이 좋습니다. –

+1

@EitanT 잊어 버린 'bsxfun'을 추가해 주셔서 감사합니다 ;-) 너무 재미 있습니다! – Shai

+0

많은 레코드가있을 수 있습니다 (예 : d = 13 차원의 1000 레코드). 대규모 데이터 세트에는 적용 할 수 없다고 생각합니다! 그러나 코드를 완전히 이해할 수 없었습니다. – remo

2

우리가 알고 있기 때문에 그리고 B는 항상 같은 행을 가지고 있습니다. 각각을 공통의 동일한 표현으로 변환하는 변환을 찾아 봅시다. 약 sort은 어떻습니까? 이제 A(Ai,:) == B(Bi,:)

[As, Ai] = sortrows(A); 
[Bs, Bi] = sortrows(B); 

, 그래서 우리가해야 할 일은 아이를 일치 양성을위한 인덱스를 찾을 수 있습니다. Bi는 순방향 매핑이고, Ai는 역 매핑입니다. 그래서 :

p = zeros(size(A,1),1); 
p(Ai) = Bi; 

0

여기 모든 순열을 생성하는 필요의 문제를 해결하기 위해 sort()를 사용하여 솔루션 (문제 설명의 편집에 맞게 편집 된 답변).

동일한 정렬 된 매트릭스를 생성하는 AB을 모두 정렬하는 것이 좋습니다. 순열은 이제 두 개의 정렬 된 행렬을 생성하는 인덱스 IAIB을 사용하여 찾을 수 있습니다.

A = [ 2 3 4; 4 5 6; 2 3 4]; 
B = [ 4 5 6; 2 3 4; 2 3 4]; 

[CA,IA]=sort(A,1) 
[CB,IB]=sort(B,1) 

idxA = IA(:,1) 
idxB = IB(:,1) 

[~, idxB_inverse] = sort(idxB) 

idxA(idxB_inverse)