0

私は2つのベクトルを持っています:

A = [1 2]
B = [3 4 5]

単射である A と B の間のすべての異なるマッピングを見つけたいと思います。つまり、結果は次のようになります。

1 3     1 4     1 5     1 3     1 4     1 5
2 4     2 3     2 3     2 5     2 5     2 4
  5       5       4       4       3       3

MATLAB でこれを行う方法を提案する人はいますか? ありがとう!

4

1 に答える 1

1

基本的に、範囲ベクトルのすべての順列を計算する必要がありますB

perms(B).'

これにより、目的の結果の 2 番目の列が得られます。最初の列は、転置されたドメイン ベクトルです。A.'


マッピングを保存するには、各 2 列目の最初のn行を保持するだけで済みます。ここで、 nは の長さですAunique重複する可能性があるため、 ;で削除します。

aux = perms(B);
mappings = unique(aux(:,1:length(A)),'rows').';

したがって、j番目のマッピングによるi番目の要素のmappings(i,j)イメージです。A


reshape投稿した形式で結果を表示するには、ドメインとマッピングの範囲をインターリーブするために少しだけ操作する必要があります。

>> reshape([repmat(A.',1,size(mappings,2)); mappings],length(A),[])

ans =
     1     5     1     5     1     4     1     4     1     3     1     3
     2     4     2     3     2     5     2     3     2     4     2     5
于 2013-10-11T10:41:03.520 に答える