我正在尝试计算结构数据类型的距离。
距离法为:
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
.
我可以犯的几个错误和建议:
sqrt
函数仅接受单个输入参数。 您正在指定两个输入参数。您也没有正确计算SSD。 执行
z = bsxfun(...);
时,只需计算data
与输入查询点c(i, :)
之间的分量距离。 您还必须对所有分量距离求和。 这可能就是您的sqrt
函数调用错误的原因,因为您可能还打算在sqrt
之外添加一个sum
: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);