2017-06-07 2 views
2

0の行列(89x42)と、行の組み合わせを一緒に乗算したい1があります。組み合わせと乗算matlabの配列の行

例えば、マトリックス

input = [1 0 1 
     0 0 0 
     1 1 0]; 

及び2つの組合せを有するため、私は行を乗算する

output = [0 0 0; % (row1*row2) 
      1 0 0; % (row1*row3) 
      0 0 0] % (row2*row3) 

の出力は、(NCK) "N 2を選択" によって決定される場合、または一度にkと取られた行nのすべての可能な組み合わせ。この場合k=2

現在、私はループを使用していますが、89C2の組み合わせの場合はうまく動作しますが、89C3で実行すると時間がかかりすぎます。

私は2つ以上の組み合わせを行うことができるので、このプログラムを実行する最も効率的な方法は何でしょうか?

+1

あなたが二つ以上の組み合わせが何を意味するのですか? _n_ Choose 3の希望の結果の例を与える。 –

答えて

3

nchoosekelement-wise multiplicationを使用してください。あなたが行うことができます

inp = [1 0 1; 0 0 0; 1 1 0];   %Input matrix 
C = nchoosek(1:size(inp,1),2);  %Number of rows taken 2 at a time 
out = inp(C(:,1),:) .* inp(C(:,2),:); %Multiplying those rows to get the desired output 
+0

OPが3,4、...行の積を取得したい場合は、最後の行を編集してより多くの項を追加する必要がありますか? –

+0

@ Dev-iL私は答えが最後にある 'permute'、' reshape'、 'prod'と多かれ少なかれ同じ行を含むように私の答えを編集しようとしていました。今何か違うことを考える –

2

いくつかのこと:

  1. 使用logical( "バイナリ")アレイ(あるいはsparse論理配列)の代わりに、二重のアレイ。
  2. optimized combinatorical functionsを使用してください。
  3. bitandまたはandtimes(該当する場合)の代わりに。
  4. ベクタライズ

    function out = q44417404(I,k) 
    
    if nargin == 0 
        rng(44417404); 
        I = randi(2,89,42)-1 == 1; 
        k = 3; 
    end 
    
    out = permute(prod(reshape(I(nchoosek(1:size(I,1),k).',:).',size(I,2),k,[]),2),[3,1,2]); 
    
関連する問題