将元素附加到数组的最快方法是什么?

jub*_*0bs 6 optimization matlab append

这是如何在MATLAB中将元素附加到数组的后续问题该问题解决了如何将元素附加到数组.这里讨论了两种方法:

A = [A elem]  % for a row array
A = [A; elem] % for a column array
Run Code Online (Sandbox Code Playgroud)

A(end+1) = elem;
Run Code Online (Sandbox Code Playgroud)

第二种方法具有与行和列阵列兼容的明显优势.

但是,这个问题是:两种方法中哪一种最快?我的直觉告诉我,第二个是,但我想要一些证据支持或反对.任何的想法?

jub*_*0bs 6

第二种方法(A(end+1) = elem)更快

根据下面的基准测试(使用timeitFile Exchange 的基准测试功能运行),第二种方法 ( A(end+1) = elem) 速度更快,因此应该是首选。

但有趣的是,两种方法之间的性能差距在旧版本 MATLAB 中比在较新版本中要小得多

R2008a

在此输入图像描述

R2013a

在 MATLAB R2013a 中运行基准测试

基准代码

function benchmark

    n = logspace(2, 5, 40);
    % n = logspace(2, 4, 40); 
    tf = zeros(size(n));
    tg = tf;

    for k = 1 : numel(n)
        x = rand(round(n(k)), 1);

        f = @() append(x);
        tf(k) = timeit(f);

        g = @() addtoend(x);
        tg(k) = timeit(g);
    end

    figure
    hold on
    plot(n, tf, 'bo')
    plot(n, tg, 'ro')
    hold off
    xlabel('input size')
    ylabel('time (s)')
    leg = legend('y = [y, x(k)]', 'y(end + 1) = x(k)');
    set(leg, 'Location', 'NorthWest');
end

% Approach 1: y = [y, x(k)];
function y = append(x)
    y = [];
    for k = 1 : numel(x);
        y = [y, x(k)];
    end
end

% Approach 2: y(end + 1) = x(k);
function y = addtoend(x)
    y = [];
    for k = 1 : numel(x);
        y(end + 1) = x(k);
    end
end
Run Code Online (Sandbox Code Playgroud)