Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何加速这个matlab循环_Matlab_Performance_Loops - Fatal编程技术网

如何加速这个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

我希望您能在这里帮助我,我在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 = 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
。谢谢:)是的,这就是我要找的!谢谢:)是的,这就是我要找的!谢谢:)