2017-06-26 3 views
2

B ist ein Array. Wenn B = [1 2 1], meine erwartete Ausgabe ist: [0 0 0], [1 0 0], [1 1 0], [1 1 1], [0 1 1], etc. und meine Funktion ist folgende:Wie codiert man "alle Kombinationen" in MATLAB?

function [output] = AllCombination(B) 
output = []; 
for i = 0:B(1) 
    for j = 0:B(2) 
     for k = 0:B(3) 
      output = [output; [i,j,k]]; 
     end 
    end 
end 

jedoch B beliebig lang sein kann. Was soll ich tun, um das an jede Länge von B anzupassen?

+3

Wenn ich Ihre Frage richtig verstanden habe, können Sie den Ansatz verwenden [hier] (https://stackoverflow.com/questions/21895335/generate-a-matrix-containing-all-combinations-of-elements-taken-from -n-Vektoren/21895344 # 21895344) Definition von Vektoren = Zelle (1, Anzahl (B)); für k = 1: Zahl (B), Vektoren {k} = 1: B (k); end' –

Antwort

2
function [output] = AllCombination(B) 
C = arrayfun(@(x)0:x, B, 'UniformOutput', false); 
D = cell(1,numel(B)); 
[D{:}]=ndgrid(C{:}); 
output = cell2mat(cellfun(@(x)x(:), D, 'UniformOutput', false)); 

Die erste Linie konstruiert eine Zellenanordnung Bereiche enthält von 0 bis zu jedem der Elemente von B. Die zweite erstellt eine leere Zellen-Array der richtigen Größe der Ausgangssignale von der dritten Zeile zu speichern, die den Bereichen von Schritt 1 in ndgrid gibt. Dies konstruiert alle Kombinationen der Bereiche. Schließlich wenden wir cellfun jeweils in einen Spaltenvektor zu konvertieren und verketten sie mit cell2mat.

0

Eine andere Lösung:

L = prod(B+1); % length of the resulting array 
output = zeros(L,length(B)); % preallocating memory 
for ii = 1:length(B) % for each column of the output array 
    output(:,ii) = imresize(repmat(0:B(ii),1,prod(B(1:(ii-1))+1)), [1 L], 'nearest')'; 
end 

Erläuterung:

repmat(0:B(ii),1,prod(B(1:(ii-1))+1) 

Wiederholt die Sequenz 0:B(ii) so oft wie das Produkt aller Elemente von B vor sich her. Um zu berücksichtigen, dass die Zählung bei Null beginnt, fügen wir allen Elementen +1 hinzu.

imresize(...,[1 L], 'nearest')'; 

Scales den Vektor dann auf die Länge des Arrays

Edit:

Version interp1 statt imresize im Falle verwenden Sie die Bildverarbeitung Toolbox nicht haben:

L = prod(B+1); % length of the resulting array 
output = zeros(L,length(B)); % preallocating memory 
for ii = 1:length(B) % for each column of the output array 
    p = prod(B(1:(ii-1))+1); 
    output(:,ii) = interp1(1:(((B(ii)+1)*p)), repmat(0:B(ii),1,p), linspace(1, (((B(ii)+1)*p)), L), 'nearest'); 
end 
+1

Sie _really_ müssen nicht mit Hilfe von Image Processing Toolbox greifen dieses Problem zu lösen. –

Verwandte Themen