1 // Outer product of tensors
27 if (istensor(p1
) && istensor(p2
))
33 tensor_times_scalar();
34 else if (istensor(p2
))
35 scalar_times_tensor();
45 int i
, j
, k
, ndim
, nelem
;
47 ndim
= p1
->u
.tensor
->ndim
+ p2
->u
.tensor
->ndim
;
50 stop("outer: rank of result exceeds maximum");
52 nelem
= p1
->u
.tensor
->nelem
* p2
->u
.tensor
->nelem
;
54 p3
= alloc_tensor(nelem
);
56 p3
->u
.tensor
->ndim
= ndim
;
58 for (i
= 0; i
< p1
->u
.tensor
->ndim
; i
++)
59 p3
->u
.tensor
->dim
[i
] = p1
->u
.tensor
->dim
[i
];
63 for (i
= 0; i
< p2
->u
.tensor
->ndim
; i
++)
64 p3
->u
.tensor
->dim
[j
+ i
] = p2
->u
.tensor
->dim
[i
];
68 for (i
= 0; i
< p1
->u
.tensor
->nelem
; i
++)
69 for (j
= 0; j
< p2
->u
.tensor
->nelem
; j
++) {
70 push(p1
->u
.tensor
->elem
[i
]);
71 push(p2
->u
.tensor
->elem
[j
]);
73 p3
->u
.tensor
->elem
[k
++] = pop();
101 "H3344=outer(H33,H44)",
104 "H4455=outer(H44,H55)",
107 "H33444455=outer(H33,H44,H44,H55)",
110 "simplify(inner(H3344,H4455)-contract(H33444455,4,5))",
117 test(__FILE__
, s
, sizeof s
/ sizeof (char *));