2016-11-27 3 views
0

In eigen, kann man ganz leicht Tensorverjüngung tun mit:Wie mache ich äußere Produkt von Tensoren in Eigen?

Tensor<double, 1> tensor1; 
Tensor<double, 2> tensor2; 

// fill with data so that 
// tensor1 is of dimensions [10] and tensor2 of dimensions [5,10] 

std::array<Eigen::IndexPair<int>, 1> product_dims1 = { IndexPair<int>(1, 0) }; 

auto tensor = tensor2.contract(tensor1, product_dims1); 

// now tensor is of dimensions [5] 

ich für ein Verfahren suchen, die das Gegenteil von Kontraktion der Fall ist, dauert es zwei Tensoren A bedeutet und B, sagen der Dimensionen 5 x 10 und 3 x 2 und definiert einen neuen Tensor C Abmessungen 5 x 10 x 3 x 2, so dass

C_ijkl = A_ij * B_kl 

ich leicht, ein solches Verfahren, wenn notwendig schreiben könnte, aber ich habe das Gefühl, es wäre mehr optimiert werden, wenn ich gebraucht eine native Eigenmethode. Ich möchte auch GPU-Unterstützung verwenden können, die mit eigen ziemlich einfach ist, wenn Sie die nativen Methoden verwenden.

Danke.

+0

Haben Sie versucht, den '*' Operator? –

+0

@Kerrek funktioniert das nicht, siehe hier: http://StackOverflow.com/Questions/41098944/Why-does-the-following-fail-with-eigen – kloop

Antwort

0

Sie können ein äußeres Produkt erzielen, indem Sie die Eingabe-Tensoren so umformen, dass die Dimensionen mit zusätzlichen eindimensionalen aufgefüllt und dann über die neuen Dimensionen übertragen werden.

Für die beiden Rang-2 und einen Rang-4-Tensoren haben Sie C_ijkl = A_ij * B_kl es würde so aussehen:

#include <Eigen/Core> 
#include <unsupported/Eigen/CXX11/Tensor> 

using namespace Eigen; 

int main() { 

Tensor<double, 2> A_ij(4, 4); 
Tensor<double, 2> B_kl(4, 4); 
Tensor<double, 4> C_ijkl(4, 4, 4, 4); 

Tensor<double, 4>::Dimensions A_pad(4, 4, 1, 1); 
array<int, 4> A_bcast(1, 1, 4, 4); 

Tensor<double, 4>::Dimensions B_pad(1, 1, 4, 4); 
array<int, 4> B_bcast(4, 4, 1, 1); 

C_ijkl = A_ij.reshape(A_pad).broadcast(A_bcast) * 
     B_kl.reshape(B_pad).broadcast(B_bcast); 

} 
Verwandte Themen