2017-03-19 5 views
2

Ich war überrascht, dass R Recycling finden nicht in höheren Dimensionen gelten:Recycling höherdimensionalen Arrays

> str(Z) 
num [1:5, 1:100, 1:10] 1.02 0.989 2.555 1.167 -0.835 ... 
> str(w) 
num [1:5, 1:100] 1.43 7.84 6.13 2.91 2.8 ... 
> Z + w 
Error in Z + w : non-conformable arrays 

während ich die 2D-Matrix erwartet w entlang der dritten Dimension Z recycelt werden. Ich bekomme den gleichen Fehler mit einer Matrix w mit Dimensionen wie die letzten 2 von Z (wie bei numpy's Rundfunkregel). Ich dachte mir, wenn man R recycelt, würde man jedes Array in der Reihenfolge der Dimensionen (C-Stil) einfach abflachen und sie dann wieder formen, was in so vielen Dimensionen funktionieren würde. Gibt es einen richtigen Weg, eine Matrix zu recyceln, wie ich es versuche? Ich denke, ich könnte die Abflachung und die Umformung selbst vornehmen, indem ich die dunklen Attribute manipuliere, aber ich würde es vorziehen, die Arbeit nicht selbst zu machen.

Die Sprachdefinition hat diese Zeile: "Das heißt, wenn Sie zum Beispiel c (1, 2, 3) zu einem Vektor mit sechs Elementen hinzufügen, fügen Sie wirklich c (1, 2, 3, 1, 2 , 3)." Kann jemand, der unter die Haube geschaut hat, mir sagen, ob R buchstäblich einen neuen längeren Vektor aus dem kürzeren erzeugt, um den anderen Operanden anzupassen und dann den Operator anzuwenden? Ich hatte angenommen, das Recycling sei platzsparender. Wenn nicht, dann könnte ich auch das höherdimensionale Recycling erreichen, indem ich ein 3-Wege-Array aus der Matrix erzeuge. Ich stelle mir vor, es gibt ein Paket für Mehrwege-Arrays/Tensoren, aber ich würde lieber Base verwenden.

Antwort

0

Implizites Recycling funktioniert nur mit Vektoren. Eine Lösung für das Matrixrecycling ist die Verwendung der Sweep-Funktion, wie in der Dokumentation here dokumentiert. Versuchen Sie in Ihrem Fall

sweep(Z,1:2,w,FUN="+") 

Das zweite Argument gibt an, welche Dimensionen von Z beibehalten werden.

Verwandte Themen