从 GUIDE GUI 中执行时,Matlab 计算速度变慢
Matlab calculations slows to a crawl when executed from within a GUIDE GUI
(以下发生在配备 16GB RAM 的 Macbook Pro 2.3GHz i7 Haswell 上)
问题
在 Matlab 中我有一个 3D 数据处理算法。在这种情况下,三向嵌套循环的维度在每个向量 <1000 个值的范围内(即 z<1000、y<1000、x<1000)。对于每个体素,执行一组动态计算。当从 Matlab 命令行执行时,算法的速度很好。它 运行 在相对高端的机器上可以预期。
当我将这段完全相同的代码(复制和粘贴)移动到由 Matlab 生成的 GUIDE GUI 回调函数(一个按钮)时,执行速度减慢到绝对爬行。它不是正常速率的 1/10 甚至 1/100。可能它的收盘价是正常汇率的 1/1000... 或类似的数量级。
想法
所以我最初的想法是,这种根本性的性能下降一定是来自 GUI。因此,我尝试实现 parfor
Matlab 关键字,以便 运行 并行计算密集型 for 循环。这是不可能的,因为在 parfor
循环内创建的任何变量都不能在循环外使用。或者至少这就是我解释在尝试使用该方法时遇到的 Matlab 错误的方式。
我也尝试在新线程中生成计算,但似乎没有以任何方式提高性能。
问题
我的问题:当从 Matlab GUI 运行ning 时,是否有某种方式可以执行计算密集型任务?
加法
这种情况的伪代码。循环中使用了以下 Matlab 函数:max()、abs()、sqrt()、zeros()、mod()、fprintf() 请注意 fprintf() 的使用不要过多,我知道过度调用这样的函数可能会导致性能下降。
for-loop
fprintf(1,'%d ',i);
if (mod(i,20)==0)
fprintf(1,'\n'); % output iteration status
end
for-loop
for-loop
some variable assignments
declare variables and init them to 1 or 0
for-loop Xvar
if ((condition)) <= 0.0
variable assignment
end
if ((condition)) <= 0.0
variable assignment
end
end
for-loop Yvar
if ((condition)) <= 0.0
variable assignment
end
if ((condition)) <= 0.0
variable assignment
end
end
for-loop Zvar
if ((condition)) <= 0.0
variable assignment
end
if ((condition)) <= 0.0
variable assignment
end
end
somevariable=zeros(args);
for-loop
multiplication assignment to variable
multiplication assignment to variable
variable assignment
for-loop
for-loop
for-loop
sqrt calculation with some divisions and squares
if-statement
subtraction addition assignment
if-statement
var=some other var;
end
end
end
end
end
somevarindexed(m)=stuff calculated above;
end
variable assignment;
3Dvector(x,y,z) assignment;
3Dvector(x,y,z) assignment;
end
end
end
在三层循环内更改的全局矩阵变量是导致此问题的原因。重构代码后,现在一切都按预期工作了。
(以下发生在配备 16GB RAM 的 Macbook Pro 2.3GHz i7 Haswell 上)
问题
在 Matlab 中我有一个 3D 数据处理算法。在这种情况下,三向嵌套循环的维度在每个向量 <1000 个值的范围内(即 z<1000、y<1000、x<1000)。对于每个体素,执行一组动态计算。当从 Matlab 命令行执行时,算法的速度很好。它 运行 在相对高端的机器上可以预期。
当我将这段完全相同的代码(复制和粘贴)移动到由 Matlab 生成的 GUIDE GUI 回调函数(一个按钮)时,执行速度减慢到绝对爬行。它不是正常速率的 1/10 甚至 1/100。可能它的收盘价是正常汇率的 1/1000... 或类似的数量级。
想法
所以我最初的想法是,这种根本性的性能下降一定是来自 GUI。因此,我尝试实现 parfor
Matlab 关键字,以便 运行 并行计算密集型 for 循环。这是不可能的,因为在 parfor
循环内创建的任何变量都不能在循环外使用。或者至少这就是我解释在尝试使用该方法时遇到的 Matlab 错误的方式。
我也尝试在新线程中生成计算,但似乎没有以任何方式提高性能。
问题
我的问题:当从 Matlab GUI 运行ning 时,是否有某种方式可以执行计算密集型任务?
加法
这种情况的伪代码。循环中使用了以下 Matlab 函数:max()、abs()、sqrt()、zeros()、mod()、fprintf() 请注意 fprintf() 的使用不要过多,我知道过度调用这样的函数可能会导致性能下降。
for-loop
fprintf(1,'%d ',i);
if (mod(i,20)==0)
fprintf(1,'\n'); % output iteration status
end
for-loop
for-loop
some variable assignments
declare variables and init them to 1 or 0
for-loop Xvar
if ((condition)) <= 0.0
variable assignment
end
if ((condition)) <= 0.0
variable assignment
end
end
for-loop Yvar
if ((condition)) <= 0.0
variable assignment
end
if ((condition)) <= 0.0
variable assignment
end
end
for-loop Zvar
if ((condition)) <= 0.0
variable assignment
end
if ((condition)) <= 0.0
variable assignment
end
end
somevariable=zeros(args);
for-loop
multiplication assignment to variable
multiplication assignment to variable
variable assignment
for-loop
for-loop
for-loop
sqrt calculation with some divisions and squares
if-statement
subtraction addition assignment
if-statement
var=some other var;
end
end
end
end
end
somevarindexed(m)=stuff calculated above;
end
variable assignment;
3Dvector(x,y,z) assignment;
3Dvector(x,y,z) assignment;
end
end
end
在三层循环内更改的全局矩阵变量是导致此问题的原因。重构代码后,现在一切都按预期工作了。