1

Matlab で X 行 10 列の数値配列を生成しました。この配列は、4、3、および 3 の列セットに「精神的に」分割されます。この配列が以下に示されている場合、2 つの行

[1 2 3 4 ; 5 6 7 ; 8 9 10] [1 2 3 4 ; 8 9 10 ; 5 6 7]

セミコロンは精神的な区切りです。この配列をさらに処理する必要がありますが、「メンタル カラム」順列でも同じ情報が得られます。2 番目の行は、最初の行の 2 番目と 3 番目の「心の行」の順列です。

Matlab の組み込み関数を使用して順列を取り除く簡単な方法はありますか? 順列を認識する一意のようなものです。

4

2 に答える 2

2

行が matrixAに格納され、列セットの幅がに格納されてlenいるとします (この場合は になりますlen = [4, 3, 3])。まず、セル配列でこのデータを適切に表す必要があります。

X = mat2cell(A, ones(size(A, 1), 1), len);

次に、そのようなセル配列内の列のすべての可能な組み合わせを (繰り返しなしで) 見つけます。

cols = perms(1:numel(len));

ここで、Xインデックスr1およびの指定された 2 つの行r2について、一方が他方の順列であるかどうかを確認します (つまり、 「メンタル」列の順序が変更されているかどうか)。

any(arrayfun(@(n)isequal(X(r1, :), X(r2, cols(n, :))), 1:size(cols, 1)))

これに続いて、行のすべての可能なペアを (繰り返しなしで) 見つけることができ、行の各ペアについて、それらが互いの順列であるかどうかを確認します。

rows = nchoosek(1:size(A, 1), 2);
N = size(cols, 1);
isperm = @(ii, jj)any(arrayfun(@(n)isequal(X(ii, :), X(jj, cols(n, :))), 1:N));
remove_idx = arrayfun(isperm, rows(:, 1), rows(:, 2));

そして、それらを削除するのはパイと同じくらい簡単です:

A(remove_idx, :) = [];

次のデータを入力として取りましょう。

A = [1:10; 11:20; 1:4 8:10 5:7];
len = [4 3 3];

あれは:

A =
    1    2    3    4    5    6    7    8    9   10
   11   12   13   14   15   16   17   18   19   20
    1    2    3    4    8    9   10    5    6    7

len =
   4   3   3

そして、次のコードを実行します。

X = mat2cell(A, ones(size(A, 1), 1), len);
cols = perms(1:numel(len))
rows = nchoosek(1:size(A, 1), 2)
N = size(cols, 1)
isperm = @(ii, jj)any(arrayfun(@(n)isequal(X(ii, :), X(jj, cols(n, :))), 1:N));
remove_idx = arrayfun(isperm, rows(:, 1), rows(:, 2));
A(remove_idx, :) = [];

結果は次のとおりです。

remove_idx =
   0
   1
   0

A =
    1    2    3    4    5    6    7    8    9   10
    1    2    3    4    8    9   10    5    6    7
于 2013-07-25T17:28:02.083 に答える