Wie interpretiert Julia 10: 1?

8

Ich bin ein Expat, weil ich mich lange auf R konzentriere, wo der Operator : (Doppelpunkt) ganzzahlige Folgen vom ersten bis zum zweiten Argument erzeugt:

%Vor%

Nachdem mir aufgefallen ist, dass dies in Julia anscheinend genauso funktioniert, kam es zu einem Fehler:

%Vor%
  

DimensionMismatch ("Arrays konnten nicht auf eine gemeinsame Größe übertragen werden")

Weil:

%Vor%

Ausgaben

%Vor%

Ich bin verwirrt darüber, wie das hätte passieren können. Es scheint ziemlich natürlich, nicht 10:-1:1 verwenden zu müssen - warum dachte Julia 10:9 war die richtige Interpretation von 10:1 ?

    
MichaelChirico 23.03.2017, 01:36
quelle

2 Antworten

15

Julia ist nicht R. Es gibt andere Sprachen, die für die Dickdarmsyntax eine ähnliche Interpretation haben wie Julia. MATLAB behandelt 10:1 als leeres Array und Pythons Slicing-Syntax behandelt die Indizierung mit 10:1 als leere Auswahl. Julia wählt leere Ganzzahlen so zu normalisieren, dass der Unterschied zwischen Start und Stopp immer -1 ist, also wird es 10:9 .

Ich glaube also nicht, dass es eine eindeutig eindeutige Interpretation von 10:1 gibt. Es gibt jedoch einige sehr förderliche Argumente für Julias Interpretation meiner Meinung nach:

  • Der leere Bereich 10:9 wird verwendet, um die Position zwischen den Indizes 9 und 10 in einige APIs .

  • Bereiche sind ein Kernkonstrukt in Julia und for x in 1:10 muss absolut und eindeutig so schnell sein wie die äquivalente C-Schleife. Da die Syntax x:y immer um eins erhöht wird (und niemals eine negative), kann Julia (und LLVM) diese Konstante beim Kompilieren von for-Schleifen nutzen, um weitere Optimierungen zu ermöglichen. Wenn dies nicht konstant ist --- oder schlechter, würde das dynamische Umschalten zwischen UnitRange und StepRange in Abhängigkeit von den Werten der Endpunkte diese Optimierung vereiteln oder typinstabil sein.

  • Persönlich finde ich die Interpretation von R genauso überraschend wie die von Julia. Ich würde argumentieren, dass die Notwendigkeit, explizit zu sein, dass Sie einen Schritt von -1 wollen, sowohl in der Lesbarkeit als auch in der Fehlerprävention von Vorteil ist. Aber ich gebe zu, dass meine Erfahrung mit früheren Sprachen genau so voreingenommen ist wie Ihre.

Matt B. 23.03.2017, 02:56
quelle
5

In Julia nehmen wir an, dass a:b einen Bereich mit einer Schrittgröße von 1 konstruiert 10:1 ist ein UnitRange , das ein leerer Bereich sein soll. Da a:a-1 ebenfalls ein leerer Bereich ist, entspricht dies a:b wo b<a , Bitte sehen Sie sich den Quellcode hier an.

%Vor%

Hier ist 10:-1:1 ein StepRange mit einer Schrittweite von -1, was meiner Meinung nach genauer und natürlicher ist, um die Idee von "10 zu 1" darzustellen.

    
Gnimuc 23.03.2017 02:38
quelle

Tags und Links