我有许多对象,每个对象在自己的点之间有三个距离矩阵(x1-x1,x1-x2,x1-x3 ...; x2-x1,x2-x2,x3-x2 ...)和z。
我想找到尽可能多的附近点,假设旋转不是问题。
我试过了 由于Matlab应该可以轻松处理矩阵,所以我确定有些麻烦,但我不知道如何解决。对于每个对象及其镜像,以及每个轴上的每个平移,都有一个xyz场景:(x1,y1,z1; x2,y2,z2; ...)因此,我将一个对象平移和镜像一百万次。
for m=1:object1
for n=1:object2
for i=1:NumRows
for j=1:NumRows2
d_x(m,n,i,j)=obj(m).xyz(i,1)-obj(n).xyz(j,1);
d_y(m,n,i,j)=obj(m).xyz(i,2)-obj(n).xyz(j,2);
d_z(m,n,i,j)=obj(m).xyz(i,3)-obj(n).xyz(j,3);
d_r(m,n,i,j)=sqrt(d_x(m,n,i,j)*d_x(m,n,i,j)+d_y(m,n,i,j)*d_y(m,n,i,j)+d_z(m,n,i,j)*d_z(m,n,i,j));
if d_r(m,n,i,j)>=0 & d_r(m,n,i,j)<1.2
d_r(m,n,i,j)=1.2-d_r(m,n,i,j);
else
d_r(m,n,i,j)=0;
end
sy(m,n)=sy(m,n)+d_r(m,n,i,j);
end
end
end
end
每当您开始将索引放在变量名中时,如果它们可能应该是单个变量,请三思而后行。这里我们有d_x
d_y
d_z
。我的建议是将它们替换为单个变量:
d_xyz(m,n,i,j,:)=obj(m).xyz(i,:)-obj(n).xyz(j,:);
现在到下一行,您在那里计算的实际上称为2范数。如果您知道名称,可以简单地将其缩写:
d_r(m,n,i,j) = norm(squeeze(d_xyz(m,n,i,j,:)),2);
我没有得到第二条建议行。我用过
d_r(m,n,i,j)=sqrt(d_xyz(m,n,i,j,1)*d_xyz(m,n,i,j,1)+d_xyz(m,n,i,j,2)*d_xyz(m,n,i,j,2)+d_xyz(m,n,i,j,3)*d_xyz(m,n,i,j,3));
。您在这里所做的工作是对每个数字平方,然后求和于平方根,这正是2范数的定义。也称为欧几里得距离。zh.m.wikipedia.org/wiki/Norm_(数学)
我懂了
Error using norm Input must be 2-D.
。理解您的评论有误,以为您不了解其背后的数学原理。我实际上忘记了代码。
norm
不适用于大小为[1,1,1,1,3]的输入,此处需要[3,1]向量。更新了我的答案。我确实知道数学的那一部分,但是我没有那么多编程。我很少编写程序行,有时会尝试改进它们。