我正在尝试计算struct数据类型的距离。
距离法是:
function ssd=distances(x, c)
m=size(x,1);
ssd = zeros(m, k);
k=size(c,1);
for i= 1:k
z = bsxfun(@minus,x, c(i,:));
ssd(:,i) = sqrt(z(:).^2,2);
end
然后我有c
这是一个随机数,由下面的公式产生:
for i=1:20
pop(i).Position=unifrnd(2,2,4);
pop(i).dist=distances(x= data,pop(i).Position=c);
end
x =数据为100x2。
问题是,当我调用距离方法时,它不接受传递的参数pop(i).position
。
答案 0 :(得分:0)
我可以提出一些错误和建议:
sqrt
函数只接受单输入参数。您正在指定两个输入参数。
您也没有正确计算SSD。当您执行z = bsxfun(...);
时,您只需计算data
与输入查询点c(i, :)
之间的分量距离。您还必须求和所有组件距离。这可能是您的sqrt
函数调用错误的原因,因为除了sum
之外,您可能还需要添加sqrt
:
ssd(:, i) = sqrt(sum(z.^2, 2));
顺便说一下,平方差的总和传统上不包括sqrt
操作......这就是为什么它被称为平方 和/ 的差异。 此主循环中的代码也没有任何意义:
pop(i).dist=distances(x= data,pop(i).Position=c)
我的猜测是你来自Python背景,你可以将输入指定为键值对。不要那样做。只是做:
pop(i).dist = distance(data, pop(i).Position);
此代码pop(i).Position=unifrnd(2,2,4);
将在2和2之间生成一个4 x 4矩阵...这没有意义。您可能希望生成4 x 2
矩阵以匹配数据所具有的要素数。使用其他东西,使随机数范围更大。为了得到这个4 x 2
,请指定一个额外的参数。这样的事情可以奏效:
pop(i).Position = unifrnd(2, 10, 4, 2);