【问题标题】:Does MATLAB perform common subexpression elimination?MATLAB 是否执行公共子表达式消除?
【发布时间】:2012-09-06 10:44:34
【问题描述】:

MATLAB 的优化器是否对 MATLAB 代码执行公共子表达式消除?例如:

if max(val) > minVal && max(val) < maxVal
    maxVal = max(val)
end

max(val) 多久在那里评估一次?将中间值存储在临时变量中是否有意义(假设重复计算很昂贵)还是 MATLAB 会自动处理?

【问题讨论】:

    标签: matlab optimization


    【解决方案1】:

    很确定答案是否定的子表达式消除和存储中间值。示例:

    >> x = rand(10000, 1);
    >> tic;
    for i = 1:100000
      y = max(x) + max(x);
    end
    toc;
    Elapsed time is 4.297135 seconds.
    >> tic;
    for i = 1:100000
      m = max(x);
      y = m + m;
    end
    toc;
    Elapsed time is 1.074672 seconds.
    

    即使像 + 这样的内置操作似乎也没有得到优化;类似的测试表明

    z = (x + x);
    y = z + z + z;
    

    比:

    y = (x + x) + (x + x) + (x + x);
    

    【讨论】:

    • 后者是另一种情况。在浮点算术中 z+... 产生与 x+ 不同的结果...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2015-08-24
    相关资源
    最近更新 更多