2

Angenommen, ich habe einen Vektor B = [1; 2; 3]. DannWie man einen Vektor 3 mal multipliziert, um eine 3dimensionale Matrix zu erhalten

B*B' = [1*1 1*2 1*3 ; 2*1 2*2 2*3 ; 3*1 3*2 3*3] 

Nun, ich brauche mit B die neuen Matrix B*B' wieder multiplizieren, um die folgenden 3-dimensionale Matrix C zu erhalten:

C(:,:,1) = [1*1*1 1*2*1 1*3*1 ; 2*1*1 2*2*1 2*3*1 ; 3*1*1 3*2*1 3*3*1] 

C(:,:,2) = [1*1*2 1*2*2 1*3*2 ; 2*1*2 2*2*2 2*3*2 ; 3*1*2 3*2*2 3*3*2] 

C(:,:,3) = [1*1*3 1*2*3 1*3*3 ; 2*1*3 2*2*3 2*3*3 ; 3*1*3 3*2*3 3*3*3] 

Irgendwelche Ideen, wie ich das tun kann?

(My Original-Vektor ist lang, so kann ich dies nicht manuell tun ..)

Antwort

4

Vor R2016b:

C = bsxfun(@times, permute(B, [3 2 1]), B*B'); 

Nach R2016b:

C = permute(B, [3 2 1]) .* (B*B'); 
+0

@zeeMonkeez danke, bearbeitet –

3

können Sie bsxfun verwenden, um diese Operationen auszuführen.

out = bsxfun(@times, bsxfun(@times, B, B.'), reshape(B, 1, 1, [])); 

Oder wenn Sie es lesbarer machen möchten, können Sie es in zwei Operationen austeilen. Führen Sie zuerst die erste Multiplikation durch.

tmp = bsxfun(@times, B, B.'); 

Dann ist diese vermehren sich durch B wieder (aber wir umformen B1 x 1 x 3 werden das Ergebnis eine 3D-Matrix zu machen)

out = bsxfun(@times, reshape(B, 1, 1, [])); 

Wenn Sie auf R2016b oder später sind, können Sie einfach tun, die Folgendes.

out = (B .* B.') .* reshape(B, 1, 1, []); 
1

Eine andere Form ist das Ergebnis der ersten Matrix-Multiplikation in eine Säule neu zu formen, eine zweite Matrix-Multiplikation durchzuführen, und verformen das Ergebnis:

C = reshape(B*reshape(B*B.',1,[]),numel(B)*[1 1 1]); 
Verwandte Themen