2014-12-15 5 views
11

MATLAB ist bekannt als column-major, was grob gesagt bedeutet, dass das Bearbeiten von Einträgen eines Arrays, die sich in derselben Spalte befinden, schneller ist als das Bearbeiten von Einträgen in derselben Zeile.Warum, wenn MATLAB eine Spaltenmajor ist, geben einige Funktionen Zeilenvektoren aus?

In diesem Fall, warum so viele eingebaute Funktionen, wie linspace und logspace, Zeilenvektoren ausgeben, und nicht Spaltenvektoren? Das scheint mir wie eine De-Optimisierung ...

Was, wenn überhaupt, ist der Grund für diese Designentscheidung?

+1

Das ist eine sehr gute Frage! Meine Vermutung wäre wahrscheinlich, Legacy-Verhalten zu unterstützen. Vielleicht hatten ältere Versionen von MATLAB es ursprünglich als Zeilenvektoren und halten diese Form, um das alte Verhalten zu bewahren ... aber das ist wirklich nur eine Vermutung. Ich bin neugierig, die Antwort auf diese Frage selbst zu wissen. – rayryeng

+2

Weil diese Ausgänge 1D sind (die erste Dimension ist Singleton)? Es ist nicht wirklich wichtig, aber ich würde raten, weil es einfacher ist, die Ausgabe in der Befehlszeile mit Zeilenvektoren zu untersuchen. – chappjc

+0

@chappjc Ich persönlich bevorzuge Spalten in meiner Ausgabe. Ich kann die Überschriften "Spalten 1 bis ..." im Befehlsfenster nicht ertragen ... – Jubobs

Antwort

6

Es ist eine gute Frage. Hier sind einige Ideen ...

Mein erster Gedanke war, dass es in Bezug auf Leistung und zusammenhängender Speicher keinen Unterschied macht, ob es eine Zeile oder eine Spalte ist - sie sind beide zusammenhängend im Speicher. Für ein mehrdimensionales (> 1D) Array ist es richtiger, dass es effizienter ist, eine ganze Spalte des Arrays (z. B. v(:,2)) als eine Zeile (z. B.) oder eine andere Dimension zu indizieren, da dies in der Zeilenspalte (nicht Spalten) liegt Es greift nicht auf Elemente zu, die zusammenhängend im Speicher sind. Für einen Zeilenvektor, der 1-by-N ist, sind die Elemente zusammenhängend, da es nur eine Zeile gibt, so dass es keinen Unterschied macht.

Zweitens ist es einfach, Zeilenvektoren im Befehlsfenster anzuzeigen, besonders, da es die Reihen von langen Arrays umschließt. Bei einem langen Spaltenvektor müssen Sie für viel kürzere Arrays scrollen.

Weitere Gedanken ...

Vielleicht Vektorausgabe aus linspace und logspace Zeile werden nur mit der Tatsache im Einklang sein, dass colon (im Wesentlichen ein Werkzeug zum Erstellen linear beabstandeten Elemente) macht eine Reihe:

>> 0:2:16 
ans = 
    0  2  4  6  8 10 12 14 16 

Die Wahl wurde am Anfang der Zeit getroffen und das war das (vielleicht?).

Auch die Konvention für Schleifenvariablen könnte wichtig sein. Eine Zeile ist notwendig, mehrere Iterationen zu definieren:

>> for k=(1:5)', k, end 
k = 
    1 
    2 
    3 
    4 
    5 

Und vielleicht die Ausgänge der linspace und logspace werden üblicherweise geschlungen über:

>> for k=1:5, k, end 
k = 
    1 
k = 
    2 
k = 
    3 
k = 
    4 
k = 
    5 

A-Säule eine einzige Iteration mit einem nicht-skalare Schleifenvariable wird . Könnte sein? :)

Aber warum Schleife über einen Zeilenvektor sowieso? Nun, wie ich in meinen Kommentaren sage, ist es nicht so, dass ein Zeilenvektor für Schleifen verwendet wird, sondern dass er die Spalten des Schleifenausdrucks durchläuft. Das heißt, mit for v=M, wobei M eine 2-mal-3-Matrix ist, gibt es 3 Iterationen, wobei v ein 2-Element Spaltenvektor in jeder Iteration ist. Dies ist eigentlich ein guter Entwurf, wenn man bedenkt, dass dies das Aufteilen des Schleifenausdrucks in Spalten (d. H. Stücke zusammenhängender Speicher!) Umfasst.

+0

Ihre Frage bringt mehr Fragen als Antworten ':)' (+1 sowieso). Warum hat MathWorks entschieden, dass ein Zeilenvektor für for-Schleifen verwendet werden soll? Wäre es nicht sinnvoller gewesen, einen Spaltenvektor zu verwenden? Die gleiche Frage zum Doppelpunkt-Operator. – Jubobs

+0

@Judobs Es ist sicher! Als Entwickler denke ich, dass es ziemlich wahrscheinlich ist, dass einige Entwickler in den teuren Tagen des Produkts eine willkürliche Entscheidung getroffen haben und dass sie eingesperrt wurden. Das heißt jedoch nicht, dass die "Doppelpunkt" -Konvention nichts mit der "linspace" Konvention, aber es ist sehr wahrscheinlich, wenn man bedenkt, dass "Doppelpunkt" tut. – chappjc

+2

@Jubobs Eigentlich ist es nicht so, dass ein Zeilenvektor für Schleifen verwendet wird, sondern dass er die Spalten des Schleifenausdrucks durchläuft. Das heißt, mit "für v = M", wobei "M" eine 2-mal-3-Matrix ist, gibt es 3 Iterationen, wobei "v" in jeder Iteration ein 2-Elemente-Spaltenvektor ist. Dies ist eigentlich ein guter Entwurf, wenn man bedenkt, dass dies das Aufteilen des Schleifenausdrucks in Spalten (d. H. Stücke zusammenhängender Speicher!) Umfasst. – chappjc