从 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

在三层循环内更改的全局矩阵变量是导致此问题的原因。重构代码后,现在一切都按预期工作了。