首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将5D矩阵与2D矩阵相乘

将5D矩阵与2D矩阵相乘
EN

Stack Overflow用户
提问于 2011-12-20 01:03:32
回答 2查看 768关注 0票数 2

我有一个5D矩阵Cij(3,3,Nx,Ny,Nz),其中Nx,Ny和Nz作为输入。

我需要执行下面这样的操作:

代码语言:javascript
运行
复制
for ikx=1:Nx,
    for iky=1:Ny,
        for ikz=1:Nz,

            %Random simulation of fourier components
            n=zeros((3),'double');
            for j=1:9,
                ncomponent=randn(2);
                n(j)=complex(ncomponent(1),ncomponent(2));
                %Calculation of H
                H(:,ikx,iky,ikz)=dot(Cij(:,:,ikx,iky,ikz),n);
            end;
        end;
    end;
end;

问题是,增加Nx,Ny,Nz循环需要很长的时间来计算H矩阵。

有没有人知道更快得到H矩阵的方法?

EN

回答 2

Stack Overflow用户

发布于 2011-12-20 01:23:03

首先应该注意的是,在最内层的循环中,您执行了9次点积,每次都会覆盖H(:,ikx,iky,ikz)。这是没有意义的。您只需在循环中填充n的随机值,并在该循环之后计算一次H(:,ikx,iky,ikz)

但是,所有的循环都是不必要的,因为您可以利用函数DOT是矢量化的,并且可以处理5维数组(即,它将自动在第一个非单元素维度上执行点操作)。您所要做的就是使n成为一个3乘3乘Nx乘Ny乘Nz的复数矩阵。这两行代码应该会得到与上面的代码相同的结果:

代码语言:javascript
运行
复制
n = complex(rand([3 3 Nx Ny Nz]), rand([3 3 Nx Ny Nz]));
H = squeeze(dot(Cij, n));

函数SQUEEZE用于从H中删除单个维度,这将使其成为3xnxxnyxnz矩阵。

票数 3
EN

Stack Overflow用户

发布于 2011-12-20 01:25:23

您可以使用一些reshape (和permute)来做到这一点

代码语言:javascript
运行
复制
C=rand(3,3,Nx,Ny,Nz);
n=rand(3,3);

如果你想在n和C的每个元素之间进行mtrix乘法:

代码语言:javascript
运行
复制
H=reshape(n*reshape(C,3,3*Nx*Ny*Nz),[3,3,Nx,Ny,Nz])

如果想要n和C的每个元素之间的点积:

代码语言:javascript
运行
复制
H=reshape(reshape(n,1,[])*reshape(C,3*3,Nx*Ny*Nz),[Nx,Ny,Nz])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8564784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档