在Matlab中使用数组进行操作

时间:2014-06-25 09:28:51

标签: arrays matlab vector matrix calculus

我有这个二维数组

x=[62,29,64;
    63,31,62;
    65,29,60;
    63,29,62;
    63,31,62;];

每列中的第1个元素是R,第2个是G,第3个是下面的公式中的B.

我想要一个函数来计算以下操作:

enter image description here

到目前为止,我的函数定义如下所示:

function[distance]=RGB_dist(x,y)

  distance=sqrt(sum(((x-y)*[3;4;2]).^2,2));

end

使用上面的矩阵测试,disp(RGB_dist(x,x))仅输出零。这必须发生,因为他正在计算相同向量之间的距离。如何计算矩阵中任意两个矢量(线)之间的距离。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:4)

您可以使用bsxfun两次(一次用于减法,一次用于应用权重):

weights = [3 4 2];
d = squeeze(sqrt(sum(bsxfun(@times, ...
    bsxfun(@minus, x.', permute(x, [2 3 1])).^2, weights(:)))));

答案 1 :(得分:4)

一种基于 bsxfun pdist2 的方法 -

%// Input RGB matrix
x=[62,29,64;
    63,31,62;
    65,29,60;
    63,29,62;
    63,31,62;];

Wgts = [3 4 2]; %// Weights
weuc = @(XI,XJ,W)(sqrt(bsxfun(@minus,XI,XJ).^2 * W'));
out = pdist2(x,x, @(Xi,Xj) weuc(Xi,Xj,Wgts)) %// output

输出 -

out =
         0    5.1962    7.6811    3.3166    5.1962
    5.1962         0    6.0000    4.0000         0
    7.6811    6.0000         0    4.4721    6.0000
    3.3166    4.0000    4.4721         0    4.0000
    5.1962         0    6.0000    4.0000         0

根据@Luis发布的智能评论,似乎在最后一步你可以使用 - out = squareform(pdist(x,@(Xi,Xj) weuc(Xi,Xj,Wgts))),这可能会更快,但没有承诺,因为没有做适当的运行时基准测试。 squareform中引入了pdistpdist这两个概念,因此可以归功于他。但值似乎不同,所以我只是猜测{{1}}的第二个输入在这两个解决方案之间是不一样的。

答案 2 :(得分:3)

对于两条任意行(例如第1行和第2行),执行:

RGB_dist(x(1,:), x(2,:))

如果您想要所有组合,请查看pdist2。如果您没有统计工具箱(即没有pdist2),请使用nchoosek创建所有可能的行对:

I = nchoosek(1:size(x,1),2);
D = RGB_dist(x(I(:,1),:), x(I(:,2),:))
顺便提一下,如果你想使用pdistpdist2,那么你必须改变你的功能,以便能够在一次射击中找到一个观察与一个观察列表之间的距离。最简单的方法是将-替换为bsxfun,如下所示:

sqrt(sum(((bsxfun(@minus,x,y))*[3;4;2]).^2,2));

然后你可以去

D = pdist(x, @RGB_dist)

两种方法都可以提供

D =

     7
     1
     1
     7
     6
     8
     0
     2
     6
     8

squareform(D)

ans =

     0     7     1     1     7
     7     0     6     8     0
     1     6     0     2     6
     1     8     2     0     8
     7     0     6     8     0

但这可能是错误的,因为在乘以权重之后这是正方形。您可能不想要这样,所以我认为您的最终功能应该与Divakar的回答相似