有效地乘以多维矩阵

时间:2015-01-09 21:35:05

标签: matlab matrix vectorization

我很想知道是否有一种更有效的方法可以将多维矩阵的特定元素相乘,而这些元素并不需要用于'循环。

我有个人的区域*时间矩阵(例如,50个区域和1000个时间点),我想在每个时间点乘以每对区域,以在每个时间点创建每个区域对的乘积的新矩阵(50 x 50 x 1000)。我目前正在运行的方式是:

for t = 1:1000
    for i = 1:50
        for j = 1:50
            new(i,j,t) = old(i,t) .* old(j,t)

我确信你可以想象,这是超级慢。关于如何修复它以便它能更快地运行的任何想法?

1 个答案:

答案 0 :(得分:3)

%some example data easy to trace
old=[1:5]'
old(:,2)=old*i
%multiplicatiion
a=permute(old,[1,3,2])
b=permute(old,[3,1,2])
bsxfun(@times,a,b)

permute用于制作n*1*m输入矩阵中尺寸为1*n*mn*m的3d矩阵。通过这种方式更改尺寸,可以使用new(i,j,k)计算new(i,j,k)=a(i,1,k)*b(1,j,k)。逐个元素地应用这样的操作是bsxfun的设计目的。

关于bsxfun,请尝试理解简单的2d示例,例如bsxfun(@times,[1:7],[1,10,100]')首先