Ich habe verschiedene Fälle in Matlab und Oktave bemerkt, wo Funktionen sowohl Matrizen und Vektoren akzeptieren, aber nicht dasselbe mit Vektoren tun, wie es mit Matrizen tut.Octave und Matlab "Wat" Matrix/Vektor Inkonsistenzen
Dies kann frustrierend sein, denn wenn Sie eine Matrix mit einer variablen Anzahl von Zeilen/Spalten eingeben, könnte es als Vektor interpretiert werden und etwas tun, was Sie nicht erwarten, wenn die Höhe/Breite 1 für schwieriges Debuggen und macht seltsame bedingte Randfälle.
Ich werde ein paar Liste die ich gefunden habe, aber ich bin neugierig, was andere Leute in
(Hinweis ausgeführt haben. Ich bin nur für die Fälle, wo Code-Matrizen als gültige Eingabe akzeptiert alles, was wenn eine Ausnahme auslöst ein nicht-Vektormatrix gegeben wird als Argument nicht zählt)
1) „diag“ kann bedeuten, die verwendet werden diagonal aus einer Matrix oder schalten einen Vektor in eine diagonale Matrix
Seit Ersteres wird im Allgemeinen nur für quadratische Matrizen verwendet, in Matlab ist es nicht so ungeheuerlich, aber in Octave kann es besonders schmerzhaft sein, wenn Octave interpetiert Ctor beginnend mit einem Nicht-Null-Element und alles andere Nullen als „Diagonalmatrix“, dh
t=eye(3);
size(diag(t(:,3))) == [3,3]
size(diag(t(:,2))) == [3,3]
size(diag(t(:,1))) == [1,1]
2) Indexieren in einen Zeilenvektor mit Logicals Gibt einen Zeilenvektor
Indexieren in irgendetwas anderes mit Logicals kehrt
ein Spaltenvektora = 1:3;
b = true(1,3);
size(a(b)) == [1, 3]
a = [a; a];
b = [b; b];
size(a(b)) == [6, 1]
3) Indexieren in einen Vektor v mit einem Indexvektor i einen Vektor der gleichen (Zeile/Spalte zurückgibt) als V-Typ. Aber wenn entweder V oder i eine Matrix ist, den Rückgabewert hat die gleiche Größe wie ich.
a = 1:3;
b = a';
size(a(b)) == [1, 3]
b = [b,b];
size(a(b)) == [3, 2]
4) max, min, sum usw. arbeiten auf der Spalten einer Matrix individiually M, es sei denn M in welchem Fall sie arbeiten auf M als einreihige Vektor
a = 1:3
size(max(a)) == [1, 1]
a = [a;a]
size(max(a)) == [1, 3]
max ist 1xN ist besonders schlecht, da es nicht einmal eine Dimension als Argument nehmen kann (im Gegensatz zur Summe)
Welche anderen Fälle sollte ich beachten, wenn ich Octave/Matlab-Code schreibe?
nur um zu verdeutlichen: Sie können Dimension für max/min angeben: 'min (rand (3), [], 1)' oder 'max (Rand (3), [], 2)' – Amro