2017-06-07 4 views
2

Ich habe eine Matrix (89x42) von 0 's und 1' s, die ich gerne Kombinationen von Reihen zusammen multiplizieren würde.Kombination und Multiplikation Reihen von Array in Matlab

Zum Beispiel für Matrix

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

und mit 2 Kombinationen, ich will eine Ausgabe von

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

welche Zeilen durch "n Wählen Sie 2" (NCK) diktiert zu multiplizieren oder alle möglichen Kombinationen der Reihen n genommen k zu einer Zeit. In diesem Fall k=2.

Derzeit verwende ich eine Schleife und es funktioniert gut für die 89C2-Kombinationen von Zeilen, aber wenn ich es mit 89C3 ausführen, dauert es viel zu lange zu laufen.

Was wäre der effizienteste Weg, dieses Programm zu machen, so dass ich mehr als 2 Kombinationen machen kann?

+1

Was Sie mehr als zwei Kombinationen bedeuten? Geben Sie ein Beispiel für das gewünschte Ergebnis für _n_ Choose 3 –

Antwort

3

Sie können es mit nchoosek und element-wise multiplication tun.

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

Und wenn das OP möchte das Produkt von 3,4, ... Zeilen zu bekommen, sollten sie die letzte Zeile des Codes bearbeiten und weitere Begriffe hinzufügen? –

+0

@ Dev-iL Ich war im Begriff, meine Antwort so zu bearbeiten, dass sie mehr oder weniger dieselbe Zeile mit "permute", "reshape" und "prod" enthält, die deine Antwort am Ende hat. Jetzt an etwas anderes denken –

2

Mehrere Dinge, die Sie tun können:

  1. Verwendung logical ("binary") Arrays (oder sogar sparse logische Arrays) anstelle von Doppel Arrays.
  2. Verwenden Sie optimized combinatorical functions.
  3. bitand oder and anstelle von times (wo zutreffend).
  4. Vectorize:

    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]); 
    
Verwandte Themen