2016-04-18 10 views
1

Ich habe eine Variable distr=[0 3 1 0 2];, und ich habe eine Variable full die distr(i) mal i, für alle i ConTrain sollte.MATLAB: schnelle Erstellung von Vektor-Indizes

In diesem Beispiel möchte ich:

full=[2 2 2 3 5 5]; 

weil distr(2)=3 daher 3x 2, und so weiter.

Natürlich kann ich es in einem for -loop:

full=zeros([1,sum(distr)]); 
cc=1; 
for i=1:length(distr) 
    curr=distr(i); 
    full(cc:cc+curr-1)=i*ones([1,curr]); 
    cc=cc+curr; 
end 

aber das ist sehr langsam. Kennen Sie einen schnellen Weg mit MATLABs großartigem Array-orientiertem Stil? Vielen Dank!

+1

Sie wollen __run-Länge Decodierung__. Verwenden Sie 'repelem 'wie folgt:' result = repelem (1: numel (distr), distr); '. Oder sehen Sie die verknüpften Fragen und Antworten für andere Ansätze. –

+0

Ah, das ist der korrekte Name, ich konnte keine Ergebnisse finden, weil ich nicht wusste, wie man diese Eigenschaft nennt. Danke, das hilft - insbesondere die Leistungstests dort! – NicoDean

Antwort

2

Nicht sicher, aber vielleicht wird das funktionieren. Ich kann es nicht überprüfen, da ich zur Zeit MATLAB nicht habe:

full_tmp = arrayfun(@(i,n) i*ones(1,n),1:length(distr),distr,'uniformoutput',false); 
full = cat(2,full_tmp{:}); 
+0

oh ja tut es :) danke !! – NicoDean