2017-11-09 11 views
0

ベクトルvが1〜5の数であれば、nchoosek(v、2)を使って2つの要素を持つすべての組み合わせを得ることができます。しかし、この関数は行列のすべての組み合わせを得ることができるようになりました。行列の行のすべての組み合わせを取得するために使用したいと思います。nchoosek()を使用して行列の行のすべての組み合わせを取得するにはどうすればよいですか?

+0

行1と行2、行1と行3、行3と行5などで構成された新しい2行の行と行の組み合わせがnchoosekから得られるようにしたいのですか? – etmuse

+0

正確には私が必要なすべてです。実際には、その行列の行の可能な組み合わせごとにknnClassify()関数を呼び出す必要があります。したがって、すべての行列に必要な行が必要です。 –

答えて

1

から行コンボと2行の行列はここでそれを行う1つの方法ださ:

function p = q47204269(inMat) 
% Input handling: 
if nargin == 0 || isempty(inMat) 
    inMat = magic(5); 
end 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
rowsCell = num2cell(inMat,2); 
nRows = size(inMat,1); 
p = cell(nRows,1); 
for indR = 1:nRows 
    r = nchoosek(1:nRows,indR); 
    p{indR} = cell2mat(reshape(rowsCell(r.',:).',indR,1,[])); 
end 

参照また:

  • permsの機能は、あなたがやっていることに便利になるかもしれません。
  • This question
+0

ここにnとは何ですか?私は毎回n個の行を選択したい。私はまず最初のすべての組み合わせを1行だけでなく、2行3行n行よりも意味する... –

+0

@AliHassan私はそれを明確にするための答えを更新しました。 –

+0

ありがとうございました! –

0

アレイBの各層A

v = 1:size(A,1); 
a = nchoosek(v,2); 
B = zeros(2,size(A,1),length(a)); 
for i = 1:length(a) 
    B(:,:,i) = A(a(i,:)',:); 
end 

正方行列と

+0

行列の成長ループで。 –

+0

私がそれを開いたマシンとは別のマシンで動作していたかどうかテストしていましたが、転送したときに事前割り当てを再入力することを完全に忘れていました。今修正する。 – etmuse

+0

ループ内での行列の成長は、速度が重要である場合、または行列のサイズが使用可能なメモリに比べて重要な場合は、悪い習慣です。通常はそうではありません。 – nekomatic

-1

は、最も読みやすい答えが、ちょうど

A = randn(5,3); % example matrix 
N = 2; % number of rows to pick each time 
result = permute(reshape(A(nchoosek(1:size(A,1), N).', :), N, [], size(A,2)), [1 3 2]); 

結果は各三次元のスライスのいずれかを与えるような、3次元配列です:-)ワンライナーのためにサブマトリクスはAです。

関連する問題