从GUIDE GUI执行时,Matlab计算速度变慢

时间:2015-10-14 15:50:30

标签: performance matlab user-interface matlab-guide

(以下在Macbook Pro 2.3GHz i7 Haswell和16GB RAM上进行)

问题

在Matlab中我有一个3D数据处理算法。在这种情况下,三维嵌套循环,其中维度在每个向量的&lt; 1000值的范围内(即z <1000,y <1000,x <1000)。对于每个体素,执行动态计算集。当从Matlab命令行执行时,算法的速度很好。它可以在相对高端的机器上运行。

当我将这个相同的代码(复制和粘贴)移动到由Matlab生成的GUIDE GUI回调函数(一个Button)时,执行速度变慢到绝对爬行。它不是正常速率的1/10或甚至1/100。可能它会以正常速度的1/1000收盘......或某种顺序。

思想

所以我最初的想法是,这种激进的性能打击必须以某种方式来自GUI。所以我尝试实现parfor Matlab关键字,以便并行运行计算密集型for循环。这是不可能的,因为在parfor - 循环内创建的任何变量都不能在它之外使用。或者至少这是我解释在尝试使用该方法时得到的Matlab错误。

我也尝试在新线程中生成计算但似乎没有以任何方式提高性能。

问题

我的问题:从Matlab GUI运行时,是否有某种方式可以执行计算密集型任务?

加成

这种情况的伪代码。在循环中使用以下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

1 个答案:

答案 0 :(得分:0)

在三层循环内发生变化的全局矩阵变量是导致此问题的原因。重新分解代码后,现在一切都按预期工作。