Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.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
Python 为什么matlab中的逆for循环速度更快_Python_Matlab_Loops - Fatal编程技术网

Python 为什么matlab中的逆for循环速度更快

Python 为什么matlab中的逆for循环速度更快,python,matlab,loops,Python,Matlab,Loops,我最近在MATLAB中遇到了这个for循环代码,这让我很困惑,因为逆循环做同样的事情更快。为什么会发生这种情况 clear all a = rand(1000,1000); b = rand(1000,1000); for i=1:1000 for j=1:1000 c(i,j) = a(i,j) + b(i,j); end end 与反向循环相同的代码: clear all a = rand(1000,1000); b = rand(1000,1000); for i=1000:-

我最近在MATLAB中遇到了这个for循环代码,这让我很困惑,因为逆循环做同样的事情更快。为什么会发生这种情况

clear all
a = rand(1000,1000);
b = rand(1000,1000);

for i=1:1000
 for j=1:1000
 c(i,j) = a(i,j) + b(i,j);
 end
end
与反向循环相同的代码:

clear all
a = rand(1000,1000);
b = rand(1000,1000);

for i=1000:-1:1
 for j=1000:-1:1
 c(i,j) = a(i,j) + b(i,j);
 end
end

我在python中对范围(1000,1,-1)进行了相同的操作,并发现了相同的结果(逆循环速度更快)。

因为在按相反顺序执行时没有预先分配输出变量c,所以在第一次for循环迭代后,c最初被预先分配到1000 x 1000矩阵。当您计算c时,每个循环的大小都会增加,这需要在每次迭代时重新分配内存,因此速度较慢。如果打开了它们,Matlab会将其显示为警告。

因为在按相反顺序运行时没有预先分配输出变量c,所以在第一次for循环迭代后,c最初被预先分配到1000 x 1000矩阵。当您计算c时,每个循环的大小都会增加,这需要在每次迭代时重新分配内存,因此速度较慢。如果打开它们,Matlab会将其显示为警告。

逆循环速度更快,因为第一次迭代(
c(10001000)=..
)会创建一个大小为1000x1000的数组,而第一段代码会不断增加变量c的大小


为避免此类问题,请预先分配在循环中编写的变量。插入一个
c=0(10001000)
,两个版本都能快速运行。您的matlab编辑器会向您显示警告(黄线),指示代码中潜在的性能问题和其他问题。阅读这些信息

逆循环速度更快,因为第一次迭代(
c(10001000)=..
)创建了一个大小为1000x1000的数组,而第一段代码不断增加变量c的大小


为避免此类问题,请预先分配在循环中编写的变量。插入一个
c=0(10001000)
,两个版本都能快速运行。您的matlab编辑器会向您显示警告(黄线),指示代码中潜在的性能问题和其他问题。阅读这些信息

我猜,因为您没有事先声明
c
,所以每次执行1->1000意味着matlab必须扩展数组,而执行1000->1则为您预先构建一个1000项数组。@MarcB准确地说。把它贴出来作为答案!持续更快?你用什么来计时?@MarcB MATLAB甚至会给出一个警告,不知道OP为什么没有读到它?这是什么?如果阅读变得流行,那么SO上90%以上的问题都是多余的……我猜既然你没有事先声明
c
,那么每次使用1->1000意味着matlab必须扩展数组,而使用1000->1则会为你预建一个1000项的数组。@MarcB。把它贴出来作为答案!持续更快?你用什么来计时?@MarcB MATLAB甚至会给出一个警告,不知道OP为什么没有读到它?这是什么?如果阅读变得流行,那么90%以上的问题都是多余的。。。