【问题标题】:Efficient elementwise differences in MATLABMATLAB 中的有效元素差异
【发布时间】:2016-08-25 15:55:08
【问题描述】:

目前有一个 bunch of pages 关于在 MATLAB 中有效地计算成对距离(有些甚至是我的!)。我想做一些不同的事情。

而不是计算两个矩阵中的行对之间的总距离,比如XY

X = [1 1 1; 2 2 2];
Y = [1 2 3; 4 5 6];

我想计算一个 3 维矩阵,存储每对行之间的原始列差异。在上面的示例中,该矩阵将有两行(对于 X 中的 2 个观察值)、3 列和第 3 维中的 2 个切片(对于 Y 中的 2 个观察值):

diffs(:,:,1) =

     0    -1    -2
     1     0    -1


diffs(:,:,2) =

    -3    -4    -5
    -2    -3    -4

到目前为止,作为一般情况,我已经提出了两种方法来实现这一点,但我想找到一种优雅、透明和高效的方法。

Repmat+Permute 方法

% Set up data
X = rand(100,10);
Y = rand(200,10);

timer = tic;
X_tiled = repmat(X,[1 1 size(Y,1)]);
Y_tiled = repmat(permute(Y,[3,2,1]),[size(X,1),1,1]);
diffs = X_tiled - Y_tiled;
toc(timer)
% Elapsed time is 0.001883 seconds.

For-Loop 方法

timer = tic;
diffs = zeros(size(X,1),size(X,2),size(Y,1));
for i = 1:size(X,1)
    for  j =1:size(Y,1)
        diffs(i,:,j) = X(i,:) - Y(j,:);
    end
end
toc(timer)
% Elapsed time is 0.028620 seconds.

有没有人比我有更好的东西?

【问题讨论】:

    标签: performance matlab difference


    【解决方案1】:

    Y 上使用permute 将第一个维度发送到第三个位置,保持第二个维度与X 的第二个维度。这可以通过permute(Y,[3 2 1] 来实现。因此,解决方案是 -

    diffs = bsxfun(@minus,X,permute(Y,[3 2 1]))
    

    基准测试

    基准代码 -

    % Set up data
    X = rand(100,10);
    Y = rand(200,10);
    
    % Setup number of iterations
    num_iter = 500;
    
    %// Warm up tic/toc.
    for iter = 1:50000
        tic(); elapsed = toc();
    end
    
    disp('---------------- With messy REPMAT')
    timer = tic;
    for itr = 1:num_iter
        X_tiled = repmat(X,[1 1 size(Y,1)]);
        Y_tiled = repmat(permute(Y,[3,2,1]),[size(X,1),1,1]);
        diffs = X_tiled - Y_tiled;
    end
    toc(timer)
    
    disp('---------------- With sassy BSXFUN')
    timer = tic;
    for itr = 1:num_iter
        diffs1 = bsxfun(@minus,X,permute(Y,[3 2 1]));
    end
    toc(timer)
    

    输出 -

    ---------------- With messy REPMAT
    Elapsed time is 3.347060 seconds.
    ---------------- With sassy BSXFUN
    Elapsed time is 0.966760 seconds.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 2014-02-07
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      相关资源
      最近更新 更多