我有这个二维数组
x=[62,29,64;
63,31,62;
65,29,60;
63,29,62;
63,31,62;];
每列中的第1个元素是R,第2个是G,第3个是下面的公式中的B.
我想要一个函数来计算以下操作:
到目前为止,我的函数定义如下所示:
function[distance]=RGB_dist(x,y)
distance=sqrt(sum(((x-y)*[3;4;2]).^2,2));
end
使用上面的矩阵测试,disp(RGB_dist(x,x))
仅输出零。这必须发生,因为他正在计算相同向量之间的距离。如何计算矩阵中任意两个矢量(线)之间的距离。任何帮助将不胜感激。
答案 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)
%// 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
中引入了pdist
和pdist
这两个概念,因此可以归功于他。但值似乎不同,所以我只是猜测{{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),:))
顺便提一下,如果你想使用pdist
或pdist2
,那么你必须改变你的功能,以便能够在一次射击中找到一个观察与一个观察列表之间的距离。最简单的方法是将-
替换为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的回答相似