有效地乘以多维矩阵
Multiplying multi-dimensional matrices efficiently
我很想知道是否有更有效的方法来乘以不需要 'for' 循环的多维矩阵的特定元素。
我有一个个体的区域 * 时间矩阵(例如,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)
正如您所想象的那样,这非常慢。关于如何修复它以便它 运行 更快的任何想法?
%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*m
输入矩阵中生成维度为 n*1*m
和 1*n*m
的 3d 矩阵。以这种方式更改维度,可以使用 new(i,j,k)=a(i,1,k)*b(1,j,k)
计算 new(i,j,k)
。逐个元素地应用此类操作是 bsxfun
的设计目的。
关于 bsxfun
,首先尝试理解像 bsxfun(@times,[1:7],[1,10,100]')
这样的简单二维示例
我很想知道是否有更有效的方法来乘以不需要 'for' 循环的多维矩阵的特定元素。
我有一个个体的区域 * 时间矩阵(例如,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)
正如您所想象的那样,这非常慢。关于如何修复它以便它 运行 更快的任何想法?
%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*m
输入矩阵中生成维度为 n*1*m
和 1*n*m
的 3d 矩阵。以这种方式更改维度,可以使用 new(i,j,k)=a(i,1,k)*b(1,j,k)
计算 new(i,j,k)
。逐个元素地应用此类操作是 bsxfun
的设计目的。
关于 bsxfun
,首先尝试理解像 bsxfun(@times,[1:7],[1,10,100]')
这样的简单二维示例