Warum [1: 2]! = Array [1: 2]

8

Ich lerne Julia nach dem Wikibook , aber ich verstehe nicht, warum die folgenden zwei Befehle zu unterschiedlichen Ergebnissen führen:

%Vor%

Entschuldigung, wenn es eine Erklärung gibt, die ich nicht im Wikibook gesehen habe, habe ich kurz gesucht, aber keine gefunden.

    
Sheljohn 29.10.2016, 19:04
quelle

1 Antwort

7

Typ [a] führt Konvertierungen für die Elemente aus und es gibt eine einfache Konvertierung zwischen einem Bereich und einem Array (Collect). Also konvertiert Array[1:2] 1:2 in ein Array und erstellt dann ein Array von Objekten. Dies ist die gleiche Sache, warum Float64 [1; 2; 3] ein Array von Float64 ist.

Diese vorherigen Teile beantworten die falsche Antwort. Ups ...

a:b ist kein Array, es ist ein UnitRange . Warum würden Sie ein Array für A = a:b erstellen? Es braucht nur zwei Zahlen, um es zu speichern, und Sie können A[i] grundsätzlich kostenlos für i berechnen. Die Verwendung eines Arrays würde eine Menge an Speicher beanspruchen, die proportional zu b-a ist, und daher würde für größere Arrays viel Zeit für die Zuweisung benötigt, während die Zuweisung für UnitRange im Wesentlichen frei ist.

Diese Arten von Typen in Julia sind als faule Iteratoren bekannt. LinSpace ist ein anderer. Ein weiterer interessanter Satz von Typen sind die speziellen Matrixtypen: Warum verwenden Sie mehr als ein Array, um Diagonal zu speichern? Der Operator UniformScaling fungiert als Identitätsmatrix und speichert nur einen Wert (seine Skalierung), um A-kI effizient zu machen.

Da Julia ein robustes Typsystem hat, gibt es keinen Grund, all diese Dinge zu Arrays zu machen. Stattdessen können Sie sie zu einem spezialisierten Typ machen, der wie ein Array agiert ( * , + usw.) und indexiert, aber eigentlich nicht. Dadurch werden sie weniger Speicher verbrauchen und schneller sein. Wenn Sie das Array jemals benötigen, rufen Sie einfach collect(A) oder full(A) auf.

Ich habe bemerkt, dass Sie etwas konkreter gepostet haben. Der Grund hierfür ist, dass Array[1:2] die Funktion getindex für ein Array aufruft. Diese getindex -Funktion hat einen speziellen Dispatch für Range , so dass sie sich so verhält, als wäre sie von einem Array indiziert (siehe die Diskussion von früher). Das ist zwar "speziell", aber in Wirklichkeit hat es nur die Aufgabe, sich wie bei jeder anderen Funktion wie ein Array zu verhalten. [A] gibt ein Array von typeof(A) , egal was A ist, also gibt es hier keine Magie.

Chris Rackauckas 29.10.2016, 19:18
quelle

Tags und Links