【问题标题】:Why does `minmax` take longer than a consecutive `min` and `max`?为什么`minmax`比连续的`min`和`max`花费更长的时间?
【发布时间】:2017-07-13 00:25:39
【问题描述】:

基本上这个问题说明了一切,我的直觉告诉我调用minmax 应该比调用minmax 花费的时间更少。

是否有一些优化我阻止 Matlab 在以下代码中执行?

最小最大:

function minmax_vals = minmaxtest()
    buffSize = 1000000;
    A = rand(128,buffSize);
    windowSize = 100;
    minmax_vals = zeros(128,buffSize/windowSize*2);
    for i=1:(buffSize/windowSize)
        minmax_vals(:,(2*i-1):(2*i)) = minmax(A(:,((i-1)*windowSize+1):(i*windowSize)));
    end
end

单独的最小值-最大值:

function minmax_vals = minmaxtest()
    buffSize = 1000000;
    A = rand(128,buffSize);
    windowSize = 100;
    minmax_vals = zeros(128,buffSize/windowSize*2);
    for i=1:(buffSize/windowSize)
        minmax_vals(:,(2*i-1)) = min(A(:,((i-1)*windowSize+1):(i*windowSize)),[],2);
        minmax_vals(:,(2*i)) = max(A(:,((i-1)*windowSize+1):(i*windowSize)),[],2);
    end
end

【问题讨论】:

    标签: matlab


    【解决方案1】:

    总结

    您可以看到开销,因为 minmax 没有完全混淆。只需输入

    edit minmax
    

    你会看到函数!


    似乎存在到nntype.data('format',x,'Data'); 的数据类型转换,而minmax 的情况并非如此,并且可能代价高昂。这适用于 MATLAB 的神经网络 (nn) 工具,因为 minmax 属于该工具箱。

    简而言之,minmax 是较低级别的编译函数(因此它们完全混淆的),它们不需要来自nn 工具箱。


    基准测试

    这是一个稍微孤立的基准测试,没有您的窗口,并且使用timeit 而不是分析器。 我还包括了 minmax 中使用的数据转换的计时! 测试获取大矩阵中每一行的最小值和最大值,请参见下面的输出图和代码...

    似乎行数和所用时间之间存在线性关系(正如线性运算符所预期的那样),但组合 minmax 关系的系数要大得多,单独的操作大约是快了 10 倍。 您还可以清楚地看到,数据转换比 minmax 单独版本需要更多时间!

    function benchie()
        K = zeros(10, 3);
        for k = 1:10        
            n = 2^k;
            A = rand(n, 200);   
            Arow = zeros(1,200); 
            m = zeros(n,2);
            
            f1 = @()minmaxtest(A,m);
            K(k,1) = timeit(f1);
    
            f2 = @()minthenmaxtest(A,m);
            K(k,2) = timeit(f2);
            
            f3 = @()dataconversiontest(A, Arow);
            K(k,3) = timeit(f3);
        end
        figure; hold on; plot(2.^(1:10), K(:,1)); plot(2.^(1:10), K(:,2)); plot(2.^(1:10), K(:,3));
    end
    function minmaxtest(A,m)
        for ii = 1:size(A,1)
            m(ii, 1:2) = minmax(A(ii,:));
        end
    end
    function dataconversiontest(A, Arow)
        for ii = 1:size(A,1)
           Arow = nntype.data('format', A(ii,:), 'Data');;
        end    
    end
    function minthenmaxtest(A,m)
        for ii = 1:size(A,1)
            m(ii, 1) = min(A(ii,:));
            m(ii, 2) = max(A(ii,:));
        end
    end
    

    【讨论】:

      猜你喜欢
      • 2018-11-05
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 2012-02-18
      • 2019-12-07
      • 2021-08-18
      • 1970-01-01
      相关资源
      最近更新 更多