2010-06-25 6 views
35

Ich weiß, dass length(x)max(size(x)) zurückgibt und numel(x) gibt die Gesamtzahl der Elemente von x, aber was ist besser für eine 1 von n-Array? Ist es wichtig, oder sind sie in diesem Fall austauschbar?Unterschied zwischen MATLAB die Anzahl und Länge Funktionen

EDIT: Just for Kicks:

alt text

Sieht aus wie sie die gleiche Leistung weise bis zu 100k Elemente erhalten sind.

Antwort

17

In diesem Fall kehren sie gleich und es gibt keinen Unterschied. In Bezug auf die Leistung hängt es von der inneren Funktionsweise von Arrays in MATLAB ab. Z.B. Wenn es Metainformationen darüber gibt, wie viele Elemente sich im Array befinden (unabhängig von der Form), ist numel so schnell wie möglich, während max (Größe (x)) mehr Arbeit benötigt, um dasselbe zu erhalten (Größen abrufen und dann das Maximum unter diesen finden). Ich bin gewohnt, numel in diesem Fall zu verwenden, aber Leistungsrede (hypothetisch) auseinander, würde ich sagen, sie sind austauschbar.

+3

Du hast Recht auf dem Leistungsteil. Ich habe gerade 100 Iterationen von numeric vs length auf x = 1: 100000000 ausgeführt und die Zahl war durchschnittlich 3,0919 mal schneller. Sollte jedoch für kleinere Arrays nicht so wichtig sein. – Doresoom

+0

... und jetzt bin ich eigentlich neugierig auf die Leistung von Anzahl/Länge und Größe des Arrays. – Doresoom

+7

LÄNGE wird niemals der Leistungsengpass in Ihrem Programm sein! Nur wirkliche Leistungsverbesserungen sind wichtig. In allen anderen Fällen ist die Lesbarkeit des Codes wichtig. – Mikhail

16

Für ein 1-by-N-Array sind sie im Wesentlichen gleich. Für ein mehrdimensionales Array M, können sie zu unterschiedlichen Ergebnissen führen:

  • numel(M) entspricht prod(size(M)).
  • length(M) entspricht max(size(M)). Wenn M leer ist (das heißt jede Dimension ist 0), dann length(M) ist 0.
+4

Beachten Sie, wenn x = Einsen (0, n); dann max (Größe (x)) -> n solange Länge (x) -> 0 –

6

Wie bereits erwähnt, sind sie für eindimensionale Arrays identisch.

IMHO von Code Lesbarkeit Sicht length sollte auf eindimensionalen Arrays verwendet werden. Es ist ungefähr "intentional programming", Sie sehen den Code und verstehen, was Programmierer bei der Konzeption seiner Arbeit im Sinn hatte. Wenn ich numel sehe, weiß ich, dass es auf einer Matrix verwendet wird.

length vs numel war ein Diskussionsthema in unserem Team über eine Reihe von Jahren. Ex-Senior-Entwickler kümmerte sich nicht um die Wiederherstellbarkeit von Code, nur über die Arbeit, die getan wurde und nur numel in sonst nicht gut lesbaren/formatierten Code verwendet. Anderer Typ ist ein Maatmatician und verwendet length nur auf numerischen Arrays, die für ihn "echte" Arrays sind. Für Zellen-Arrays und Struct-Arrays verwendete er numel.

+2

Gute Perspektive - erhöhte Lesbarkeit über eine Minute/unbedeutende Leistungssteigerung.+1 – Doresoom

+7

Wenn ich NUMEL verwende, nehme ich nicht an, dass es auf einer Matrix gegen einen Vektor verwendet wird, ich nehme einfach an, dass es für ein Objekt verwendet wird, für das die Dimensionen unwichtig sind und nur die * Anzahl * der Elemente Angelegenheiten. – gnovice

+0

Es ist wichtig, wenn Sie diesen Code umgestalten und nicht auf den ersten Blick wissen, ob es sich um einen Vektor oder eine Matrix handelt! – Mikhail