如何加速这个matlab循环
我希望您能在这里帮助我,我在matlab中遇到了以下代码的速度问题:如何加速这个matlab循环,matlab,performance,loops,Matlab,Performance,Loops,我希望您能在这里帮助我,我在matlab中遇到了以下代码的速度问题: %Example Definition bf = 80; sam = 10000; dim = 300; a = rand(bf, sam, dim); T = rand(bf, sam, dim); x = repmat(rand(1, sam, dim), [bf 1 1]); %Calculation E = zeros(size(T, ndims(T))); dist = zeros(bf, sam); a = re
%Example Definition
bf = 80;
sam = 10000;
dim = 300;
a = rand(bf, sam, dim);
T = rand(bf, sam, dim);
x = repmat(rand(1, sam, dim), [bf 1 1]);
%Calculation
E = zeros(size(T, ndims(T)));
dist = zeros(bf, sam);
a = repmat( a, [ 1 1 dim ]);
for i = 1:dim
for j = 1:dim
dist = x(:,:,j) .* T(:,:,i);
E(i,j) = sum(sum(a(:,:,i) .* (0.5 * dist), 2), 1);
end
end
这3个二维数组非常大(如80x1000x300),因此计算此“E”矩阵需要很长的计算时间。我已经尝试过对它进行矢量化,但是我不知道如何在不进入内存限制(16GB)的情况下进行矢量化
知道如何加速吗?我不明白为什么它应该超过16GB 将每个像素存储为8B。80*10K*300=240M,因此每个矩阵接近2GB。矩阵的总容量为8GB 您的代码非常高效,减少内存使用的一个简单建议是将所有
内容都设置为单个;i、 e.单个(零(大小(T))
另一个建议是,如果要使用更多矩阵,则在完成后清除变量
另外,不要创建dist
变量,它只使用一次 我不明白为什么它应该超过16GB
将每个像素存储为8B。80*10K*300=240M,因此每个矩阵接近2GB。矩阵的总容量为8GB
您的代码非常高效,减少内存使用的一个简单建议是将所有内容都设置为单个;i、 e.单个(零(大小(T))
另一个建议是,如果要使用更多矩阵,则在完成后清除变量
另外,不要创建dist
变量,它只使用一次 首先,对循环使用i
和j
会减慢速度。见:
内存不足问题发生在a=repmat(a[1 dim])代码>按bf x sam x dim时间展开a
。但是,您访问a
的唯一位置是a(:,:,ii)
,ii
从1
到dim
。因此,在三维的300x300元件中,仅使用前300个元件
一个可能的答案是:你不需要再重复一遍,让a保持原样
另一个可能的答案是:a=repmat(rand(bf,sam,1),[1 dim])
首先,对循环使用i
和j
会减慢速度。见:
内存不足问题发生在a=repmat(a[1 dim])代码>按bf x sam x dim时间展开a
。但是,您访问a
的唯一位置是a(:,:,ii)
,ii
从1
到dim
。因此,在三维的300x300元件中,仅使用前300个元件
一个可能的答案是:你不需要再重复一遍,让a保持原样
另一个可能的答案是:a=repmat(rand(bf,sam,1),[1 dim])代码>如果将三维矩阵重塑为二维矩阵,嵌套循环将转换为矩阵乘法:
x = reshape(x,[],dim).';
a = reshape(a,[],dim);
T = reshape(T,[],dim);
E = x * (a.*T*.5);
如果将三维矩阵重塑为二维矩阵,嵌套循环将转换为矩阵乘法:
x = reshape(x,[],dim).';
a = reshape(a,[],dim);
T = reshape(T,[],dim);
E = x * (a.*T*.5);
有时只是从以下内容更新嵌套循环
for i=1:m
for j=1:n
out(i,j) = something;
end
end
到
将显著提高性能:有时只是从以下内容更新嵌套循环
for i=1:m
for j=1:n
out(i,j) = something;
end
end
到
将显著提高性能:能否通过定义T
bf
sam
a
dim
和x
来生成一个完整的小样本代码?运行循环将降低计算速度。将公式转换为直接矩阵运算和/或对循环使用并行运算。第一个是首选和可行的,因为您拥有大量数据。还可以考虑并行循环中的数据划分和处理(每一个分区都有一个)。您可以通过定义<代码> t>代码>代码> BF<代码> >代码>山姆< /代码>代码> < <代码>昏暗> /代码>和<代码> x >代码>运行循环,这将使计算速度变慢。将公式转换为直接矩阵运算和/或对循环使用并行运算。第一个是首选和可行的,因为您拥有大量数据。还考虑并行分区中的数据分区和处理(每个分区一个)。我试图用RePMAT矢量化和整形。因此,我为“X”次创建了相同的值,并在16GB上运行。不是我在这里发布的代码:)我尝试用repmat和Reforme将其矢量化。因此,我为“X”次创建了相同的值,并在16GB上运行。不是我在这里发布的代码:)你是对的!这是我的错,我忘了删除这个repmat a
。谢谢:)你说得对!这是我的错,我忘了删除这个repmat a
。谢谢:)是的,这就是我要找的!谢谢:)是的,这就是我要找的!谢谢:)