2016-04-13 3 views
1

Ich versuche eine rechteckige Matrix mit 1s auf der Diagonalen über der Hauptdiagonalen und -1s auf der Hauptdiagonale zu erzeugen. Ich habe "Auge" verwendet, das die Diagonale über dem Haupt nicht erzeugt. Hier finden Sie meinen Versuch dazu.Ich benutze MATLAB R2015b, Wie erzeugen wir eine rechteckige Matrix mit oberen Diagonalelementen 1?

N = 5 
M1 = -eye([N-1 N]) 
M2 = eye([N N-1])' 
M = M1+M2 

Ich kann dieses Problem nicht selbst lösen. Jede Hilfe oder Links zu relevanten Dokumentationen würden sehr geschätzt werden.

Antwort

0

Ich weiß nicht jeder vorkompilierte Funktion, aber Sie können leicht eine solche Matrix machen Sie sich:

N=5; 
M=7; 
diag=-eye(N,M); 
upper_diag=horzcat(zeros(N,1),eye(N,M-1)) 
final=diag+upper_diag 

die Identitätsmatrix und eine Verkettung mit der Diagonale um zu verschieben. In diesem Beispiel wird davon ausgegangen, dass Sie nach einer quadratischen Matrix suchen.

Das Ergebnis sieht so aus:

final =

-1  1  0  0  0  0  0 
0 -1  1  0  0  0  0 
0  0 -1  1  0  0  0 
0  0  0 -1  1  0  0 
0  0  0  0 -1  1  0 
+0

Dank für Ihre Antwort danken. Es ist gut für eine quadratische Matrix, die einfacher gemacht werden könnte mit M1 = diag (-ones (N, 1)) + diag (one (N-1,1), 1). Ich suchte nach einer rechteckigen Matrix. – Suga

+0

@Suga Sie haben Recht. Ich habe deine Frage nicht richtig gelesen. Es tut uns leid. Ich habe meine Antwort für eine rechteckige Matrix bearbeitet. –

+0

Es funktioniert. Vielen Dank! – Suga

0

Gerade eye und diag Matrizen wie für normale erstellen, fügen sie zusammen, dann die Zeilen hacken weg brauchen Sie nicht:

nCol = 7; 
nRow = 5; 
M = -eye(nCol) + diag(ones(nCol - 1, 1), 1); 
M = M(1:nRow, 1:nCol) 

produziert

M = 

    -1  1  0  0  0  0  0 
    0 -1  1  0  0  0  0 
    0  0 -1  1  0  0  0 
    0  0  0 -1  1  0  0 
    0  0  0  0 -1  1  0 
0

Die Version mit vier Eingängen von spdiags macht genau das und produziert eine spärliche Matrix. Möglicherweise müssen Sie dann zu full konvertieren.

M = 5; %// number of rows 
N = 7; %// number of columns 
d = [0 1]; %// specify main diagonal and the one above 
v = [-1 1]; %// values in those diagonals 
result = full(spdiags(ones(M,1)*v, d, M, N)); 

Dies gibt

result = 
    -1  1  0  0  0  0  0 
    0 -1  1  0  0  0  0 
    0  0 -1  1  0  0  0 
    0  0  0 -1  1  0  0 
    0  0  0  0 -1  1  0 
Verwandte Themen