我正在写一个关于图像识别和聚类的项目。在作为我的项目基础的出版物中有这个等式
变量描述如下:
Rj - 是第j个的旋转矩阵 群集
t_j - 是第j个的平移向量 群集
p * ij - 是从第j个开始的第i个点 群集
x_i - 是图像中的第i个点
我写这个函数有点问题所以我问作者是否可以与我分享源代码。这是我得到的
ddx=D.x-Q.translation(1);
ddy=D.y-Q.translation(2);
st=sin(Q.theta); ct=cos(Q.theta); R=[ct -st; st ct]; % rotation matrix
qq=R*[ppx0; ppy0];
qqd2=sum(qq.*qq,1);
Q.scale=sum((ddx.*qq(1,:)+ddy.*qq(2,:)).*Um) / sum(qqd2.*Um);
此处D.x
和D.y
是数据点的坐标
Q.translation
(向量),Q.scale
和Q.theta
是转换参数
ppx0
和ppy0
是* p ** ij的 x - 和 y - 坐标
Um
是包含[ U m ij ]的矩阵
但是我很难理解这个解决方案。首先,我不明白为什么他使用数组乘法(运算符.*
)而不是矩阵乘法(运算符*
)更多似乎他只使用一个/第一个点{{1} }
我希望有人能帮我试试这个源代码。提前致谢
答案 0 :(得分:1)
看起来ppx0
和ppy0
不是坐标,而是矢量或坐标。这样,
R*[ppx0; ppy0] =
[ct -st ; st ct] * [x_0 x_1 ... x_N-1 ; y_0 y_1 ... y_N-1]
因此qq
是一个2xN向量,就像[ppx0; ppy0]
一样。
在qqd2=sum(qq.*qq,1)
中,使用了.*
运算符,因为您实际上是对矩阵的每个值进行平方,以便稍后找到每个坐标对的平方距离。
在ddx.*qq(1,:)+ddy.*qq(2,:)
.*
运算符用作替换双和的快捷方式。换句话说,它们不是单独地获取每个矩阵乘积的总和(它本身就是乘法的总和),它们首先执行所有必要的乘法,然后取总和。 (我希望这是有道理的)。您可以使用一些基本矩阵代数证明所有这些工作。