gpt4 book ai didi

matlab - 如何在matlab中一次拍摄两个以上矩阵的外积?

转载 作者:太空宇宙 更新时间:2023-11-03 19:20:00 28 4
gpt4 key购买 nike

我想计算 y = a⊗a⊗a,其中 a 是一个 n×1 向量,outer product operator .在这种情况下,y 应该是一个 n×n×n 张量。

如果 y = a⊗a,很容易。我只是这样做:

y = a * a' 

但是第一种情况怎么办呢?如果有两个以上的向量,我如何在 MATLAB 中有效地计算这个外积?

最佳答案

y = u⊗v 的多维(张量)情况下,我相信您需要像这样移动第二个操作数的维度:

v_t = permute(v, circshift(1:(ndims(u) + ndims(v)), [0, ndims(u)]));

然后将它们与 bsxfun 相乘:

y = bsxfun(@times, u, v_t);

常规矩阵乘法仅针对向量和二维矩阵定义,因此我们不能在一般情况下使用它。

另请注意,如果第二个操作数是一维向量,此计算仍然会失败,因为 ndims 为向量返回 2 而不是 1。为此,让我们定义我们自己的计算维度的函数:

my_ndims = @(x)(isvector(x) + ~isvector(x) * ndims(x));

要完成答案,您可以定义一个新函数(例如。匿名函数),如下所示:

outprod = @(u, v)bsxfun(@times, u, permute(v, circshift(1:(my_ndims(u) + my_ndims(v)), [0, my_ndims(u)])));

然后想用多少次就用多少次。例如,y = a×a×a 会像这样计算:

y = outprod(outprod(a, a), a);

当然,您可以编写一个更好的函数,它采用可变数量的参数来节省您的输入。沿着这些线的东西:

function y = outprod(u, varargin)
my_ndims = @(x)(isvector(x) + ~isvector(x) * ndims(x));
y = u;
for k = 1:numel(varargin)
v = varargin{k};
v_t = permute(v, circshift(1:(my_ndims(y) + my_ndims(v)),[0, my_ndims(y)]));
y = bsxfun(@times, y, v_t);
end

希望我算对了!

关于matlab - 如何在matlab中一次拍摄两个以上矩阵的外积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14355921/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com