2014-02-06 12 views
5

Ich mag eine Funktion konstruieren, dieMatlab erstellen vektorisiert Sequenz

[n n-1 n-2 ... n-n, n-1 n-2 ... n-n, ..., n-n] 

//Example 
input : n=3 
output : [3 2 1 0 2 1 0 1 0 0] 

Ich weiß, wie dies zu tun, Schleifen, aber ich bin auf der Suche nach einer cleveren Art und Weise nimmt es Eingang n und gibt den Vektor zu tun in MATLAB

+0

Ich verstehe nicht, wie die Sequenz fr geht auf n-n ... n-n am Ende – Wajahat

+0

@Wajahat Ich habe ein paar Kommata hinzugefügt, ich hoffe, dass es verdeutlicht. –

Antwort

7

Sie können repmat verwenden, um die Matrix einige Male zu wiederholen, und dann nur den dreieckigen Teil mit Hilfe von tril auswählen. Wie folgt aus:

n=3; 
x=repmat(n:-1:0,1,n+1); 
result=x(tril(ones(n+1))>0) 

Oder in einer Zeile:

n=3; 
getfield(repmat(n:-1:0,1,n+1),{reshape(tril(ones(n+1))>0,1,(n+1)^2)}) 

Das Ergebnis dieser Funktion ist die gewünschte Ausgabe:

result = 

    3  2  1  0  2  1  0  1  0  0 
+0

Danke. Ich denke, Repmat ist die Schlüsselfunktion. Erfahren Sie mehr darüber jetzt ... – jim

+0

Ich denke, Sie brauchen '(n + 1)^2' anstelle von 16 – jim

+0

Ja, ich habe meinen Entwurf zu schnell eingefügt;) – mmumboss

4

Da Sie keine Antworten bekommen haben, hier ein Weg es zu tun:

N = 3; 
x = repmat(N:-1:0,1,N+1)-cumsum(repmat([1 zeros(1,N)],1,N+1))+1 
x = x(x>=0) 
x = 
    3 2 1 0 2 1 0 1 0 0 
+2

Oder sonst: 'x = mod ((N + 1)^2-1: -1: 0,4) - ceil ((1: ((N + 1)^2))/(N + 1)) + 1 'in einer sehr ähnlichen Ader – Dan

+1

Vielleicht eine Frage des Geschmacks, aber ich würde so etwas in der Mitte Linie gehen: 'repmat (N: -1: 0, N + 1,1)' - repmat (1: N + 1, N + 1,1) + 1 ' –

Verwandte Themen