行が 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