【问题标题】:Vectorised version of multi-dimensional outer product (`kron`)多维外积(`kron`)的矢量化版本
【发布时间】:2019-07-15 17:36:27
【问题描述】:

我已经概括了 3vector 和它自身之间的外积,以从 3-vector 的集合(NxNx3 矩阵)中获取输入。

目前,我的函数执行我想要的操作(参见下面的示例输出和输入),它看起来像这样。我想通过避免我目前使用的两个 for 循环来使其更快。

function [rr]=OuterVec(r)

N = size(r,1);
rr = zeros(N,N,3,3);

for i=1:N
    for j=1:N
        rr(i,j,:,:)=kron(reshape(r(i,j,:),[1,3]),permute(r(i,j,:),[3 2 1]));
    end
end
end

I/O 示例

c = ones(2,2);
V(1,1,:)=[1 2 3];
u = c.*V;

OuterVec(u)

ans(:,:,1,1) =

 1     1
 1     1

ans(:,:,2,1) =

 2     2
 2     2

ans(:,:,3,1) =

 3     3
 3     3

ans(:,:,1,2) =

 2     2
 2     2

ans(:,:,2,2) =

 4     4
 4     4

ans(:,:,3,2) =

 6     6
 6     6

ans(:,:,1,3) =

 3     3
 3     3

ans(:,:,2,3) =

 6     6
 6     6

ans(:,:,3,3) =

 9     9
 9     9

【问题讨论】:

    标签: matlab matrix vectorization


    【解决方案1】:

    您只需要置换维度并通过单例扩展应用逐元素产品:

    rr = bsxfun(@times, r, permute(r, [1 2 4 3]));
    

    或者,在 Matlab R2016b 及更高版本中,

    rr = r .* permute(r, [1 2 4 3]);
    

    【讨论】:

    • 谢谢,如果我有两个向量,我该如何修改呢?说:uv(i,j,:,:)=kron(reshape(u(i,j,:),[1,3]),permute(v(i,j,:),[3 2 1]));
    • 我认为是bsxfun(@times, v, permute(u, [1 2 4 3]))(或v .* permute(u, [1 2 4 3])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 2022-11-29
    • 1970-01-01
    相关资源
    最近更新 更多