2016-04-12 6 views
0

In MATLAB, wenn N = 2 dies die Linie ich brauche:Repeating Elemente eines Vektors gemäß einem zweiten

M = [V(1)*ones(1,L(1)) V(2)*ones(1,L(2))]; 

Wenn N = 3, die Linie ist:

M = [V(1)*ones(1,L(1)) V(2)*ones(1,L(2)) V(3)*ones(1,L(3))]; 

Wie könnte ich ein schreiben Linie produziert die gleichen Ergebnisse für eine beliebige N?

+1

Was Sie wollen, ist die Lauflängendecodierung. Hier sind einige Ansätze: http://stackoverflow.com/questions/28501418/run-langement-decoding-in-matlab –

Antwort

2

Sie können thi s:

M = cell2mat(arrayfun(@(v,len) v*ones(1,len), V, L, 'uni', 0)); 

Beispiel:

>> V=3:5 
V = 
    3  4  5 
>> L=1:3 
L = 
    1  2  3 
>> M=cell2mat(arrayfun(@(v,len) v*ones(1,len), V, L, 'uni', 0)) 
M = 
    3  4  4  5  5  5 
+3

'v + Nullen (1, len)' wird schneller sein als 'v * Einsen (1, len)' http://undocumentematlab.com/blog/allocation-performance-take-2 – Suever

4

Seit R2015a können Sie nur die repelem Funktion in integrierten verwenden:

M = repelem(V,L) 

oder wenn numel(V) tut gleich nicht N

M = repelem(V(1:N),L(1:N)) 

Wenn Sie eine ältere Version von MATLAB haben, eine einfache betrachten Schleife

M = zeros(1, sum(L(1:N))); %// preallocation 
from = 1; 
for elem = 1:N 
    to = from + L(elem) - 1; 
    M(from:to) = v(elem)*ones(1,L(elem)); 
    from = to + 1; 
end 
+0

Danke, aber ich benutze eine ältere MATLAB-Version, nämlich 2012b. – baister