performance - MATLAB 中的高效元素差异

标签 performance matlab difference

目前有 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 循环方法

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.

还有人有比我更好的东西吗?

最佳答案

您可以使用 bsxfun 取代那个凌乱的repmat对于 under-the-hood broadcasting使用后permuteY将第一个维度发送到第三个位置,将第二个维度保留在其位置,以与 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.

关于performance - MATLAB 中的高效元素差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36956098/

相关文章:

performance - 对于我的应用程序来说,什么是更好的选择 - CoreData 或 plist

java: ByteArrayOutputStream.toByteArray() 性能

java - 遗传算法的并行化显着减慢了算法速度。为什么会这样呢?

matlab - 在 Matlab 中使用数据点和计数向量计算标准差

function - matlab:fmincon,将变量传递给nonlcon

matlab - 优化给出了意外的结果MATLAB

html - 这两个选择器有什么区别

visual-studio-2008 - Visual Studio 2010 - 对其他人来说速度慢吗?

r - 向量的简单成对差分

javascript - 在 Javascript 中查找字符串之间的差异