4

繰り返しなしでn行n列の行列のすべての組み合わせを見つけようとしています。

たとえば、次のようなマトリックスがあります。

A = [321 319 322; ...
     320 180 130; ...
     299 100 310];

次の結果が必要です。

(321180310)
(321130100
) (319320310)(
319139299)
( 322320100)(
322180299)

を使用してみndgridましたが、行または列が2回使用されます。

4

3 に答える 3

2

と を使用したより単純な (ネイティブ) ソリューションを次に示しpermsますmeshgrid

N = size(A, 1);
X = perms(1:N);                    % # Permuations of column indices
Y = meshgrid(1:N, 1:factorial(N)); % # Row indices
idx = (X - 1) * N + Y;             % # Convert to linear indexing
C = A(idx)                         % # Extract combinations

結果は行列で、各行には要素の異なる組み合わせが含まれます。

C =

   321   180   310
   319   320   310
   321   130   100
   319   130   299
   322   320   100
   322   180   299

このソリューションは、次のように短縮することもできます。

C = A((perms(1:N) - 1) * N + meshgrid(1:N, 1:factorial(N)))
于 2012-12-07T19:34:43.973 に答える
0

ALLCOMBあなたの質問の鍵です

たとえば、私は MATLAB マシンの前にいないので、Web からサンプルを取得しました。

x = allcomb([1 3 5],[-3 8],[],[0 1]) ;
ans
1 -3 0
1 -3 1
1 8 0
...
5 -3 1
5 8 0
5 8 1
于 2012-12-07T10:08:38.207 に答える
0

perms次のように列を並べ替えるために使用できます。

% A is given m x n matrix
row = 1:size( A, 1 );
col = perms( 1:size( A, 2 ) );

B = zeros( size( col, 1 ), length( row )); % Allocate memory for storage

% Simple for-loop (this should be vectorized)
% for c = 1:size( B, 2 )
%     for r = 1:size( B, 1 )
%         B( r, c ) = A( row( c ), col( r, c ));
%     end
% end

% Simple for-loop (further vectorization possible)
r = 1:size( B, 1 );
for c = 1:size( B, 2 )
    B( r, c ) = A( row( c ), col( r, c ));
end
于 2012-12-07T12:12:20.847 に答える