n = 4;
m = 3;
aa = Array[a, {n, m}];
bb = Array[b, {n, m}];
cc = Array[c, n];
dd = Table[Sum[aa[[i, j]] bb[[i, k]] cc[[i]], {i, 1, n}], {j, 1, m}, {k, 1, m}];
You can Transpose
aa
and Dot
it with bb cc
:
Transpose[aa].(bb cc) == dd
True
Alternatively, you can Transpose
aa cc
and Dot
it with bb
:
Transpose[aa cc].bb ==dd
True
Comparison with Table/Sum
combination:
SeedRandom[1]
n = 100;
m = 50;
aa = RandomReal[1, {n, m}];
bb = RandomReal[1, {n, m}];
cc = RandomReal[1, n];
dd = Table[Sum[aa[[i, j]] bb[[i, k]] cc[[i]], {i, 1, n}], {j, 1, m}, {k, 1, m}]; //
RepeatedTiming // First
0.417
ee1 = Transpose[aa].( bb cc) ; // RepeatedTiming // First
0.000051
ee2 = Transpose[aa cc].bb ; // RepeatedTiming // First
0.000045
dd == ee1 == ee2
True