2016-04-13 21 views
3

行列の順列行列を見つけることができるMATLABコードを作成しようとしています。Matlab:別の行列を生成する順列行列を見つける

以下の例を考えてみましょう。私は行列AB与えられている:

A = [1 2 3;4 5 6; 7 8 9] % is a given matrix 
B = [9 7 8;3 1 2; 6 4 5] % is a permuted version of A. 

私の目標は、行列を見つけることですL(その前の乗算A)とR(そのポスト乗算A)などL*A*R = Bこと:

% L is an n by n (3 by 3) that re-order the rows a matrix when it pre-multiply that matrix 
L = [0 0 1;1 0 0;0 1 0] 

% R is an n by n that re-order the columns of a matrix 
R = [0 1 0;0 0 1;1 0 0] 

B = L*A*R 

ABを知っているときにLRを見つけるにはどうすればいいですか?ここでは、ベースライン溶液を得

+0

これはhttp://math.stackexchange.com/の方が適切でしょう。 – Paul

答えて

4

はブルートフォースメソッドです:

function [L,R] = find_perms(A,B) 
    [n,n] = size(A); 
    p = perms(1:n); 
    I = eye(n); 
    for i=1:size(p,1) 
     for j=1:size(p,1) 
      L = I(p(i,:),:); 
      R = I(:,p(j,:)); 
      if isequal(L*A*R, B) 
       return; 
      end 
     end 
    end 
    % none found 
    L = []; 
    R = []; 
end 

はのは、それをテストしてみましょう:

A = [1 2 3; 4 5 6; 7 8 9]; 
B = [9 7 8; 3 1 2; 6 4 5]; 
[L,R] = find_perms(A,B); 
assert(isequal(L*A*R, B)); 

予想通り、右/左置換行列は、次のとおりです。

>> L 
L = 
    0  0  1 
    1  0  0 
    0  1  0 
>> R 
R = 
    0  1  0 
    0  0  1 
    1  0  0 
+0

返信ありがとうございます。私は実際にあなたのコードをコピーしてMatlabに貼り付けました。これは私が持っている答えです。なぜそれがそれを言うのか分かりません。返信をもう一度お寄せください。 "エラー:ファイル:experience.m行:3列:1 関数定義はこのコンテキストでは許可されていません" "FUNCTIONキーワードはここでは無効です"。 – Kinin

+1

最初に新しいファイルに関数を保存する必要があります... – Amro

関連する問題