在MATLAB中,
冒号运算符并不像你期望的那样工作,它有另外一种功能。事实上,MATLAB中没有内积的内置实现。你需要自己实现它,例如:
idx = max(0, ndims(A) - 1);
B_t = permute(B, circshift(1:ndims(A) + ndims(B), [0, idx - 1]));
double_dot_prod = squeeze(sum(squeeze(sum(bsxfun(@times, A, B_t), idx)), idx));
这里的A
和B
是您的张量(即多维矩阵)。向量化这个过程很难,所以我希望我的数学计算是正确的!
如果您愿意,可以将此代码放入一个函数中以方便使用。为了良好的实践,还要验证两个张量都是二阶或更高阶的。以下是友好的复制粘贴版本:
function C = double_dot(A, B)
assert(~isvector(A) && ~isvector(B))
idx = max(0, ndims(A) - 1);
B_t = permute(B, circshift(1:ndims(A) + ndims(B), [0, idx - 1]));
C = squeeze(sum(squeeze(sum(bsxfun(@times, A, B_t), idx)), idx));
一些建议:我建议您阅读在线教程,熟悉MATLAB语言的基础知识。
(:)
运算符,比如A(:)
?