想象一下以下场景:
我有两个4x100矩阵ang1_stab
和ang2_stab
。这些包含沿列的四个角度,如下所示:
195.7987 16.2722 14.4171 198.5878 199.2693...
80.2062 86.7363 89.2861 89.5454 89.3411...
68.7998 -83.8318 -80.3138 69.0636 -96.4913...
-5.3262 -23.3030 -20.6823 -18.9915 -16.7224...
95.3450 183.8212 171.0686 151.8887 177.9041...
21.4780 27.2389 23.4016 27.6631 17.2893...
-13.2767 -103.5548 -115.0615 39.6790 -112.3568...
-5.3262 -23.3030 -20.6823 -18.9915 -16.7224...
两个矩阵的第四个角度总是相同,因此可以忽略不计。
问题:ang1_stab
和ang2_stab
的某些列是交换的,所以我需要找到更适合其他矩阵的列,然后交换相应的列。
复杂性:给定角度的计算是不明确的,并且可能已经加/减了90°的倍数,例如,角度16°应考虑接近195°而不是95°。
到目前为止我尝试过:
fp1 = []; % define clusters
fp2 = [];
for j = 1:size(ang1_stab,2) % loop over all columns
tmp1 = ang1_stab(:,j); % temporary columns
tmp2 = ang2_stab(:,j);
if j == 1 % assign first cluster center
fp1 = [fp1, tmp1];
fp2 = [fp2, tmp2];
else
mns1 = median(fp1(1:3,:),2); % calculate cluster centers
mns2 = median(fp2(1:3,:),2);
% calculate distances to cluster centers
dif11 = sum(abs((mns1-tmp1(1:3))-round((mns1-mp1(1:3))/90)*90));
dif12 = sum(abs((mns1-tmp2(1:3))-round((mns1-tmp2(1:3))/90)*90));
dif21 = sum(abs((mns2-tmp1(1:3))-round((mns2-tmp1(1:3))/90)*90));
dif22 = sum(abs((mns2-tmp2(1:3))-round((mns2-tmp2(1:3))/90)*90));
if min([dif11,dif21])<min([dif12,dif22]) % assign to cluster
if dif11<dif21
fp1 = [fp1,tmp1];
fp2 = [fp2,tmp2];
else
fp1 = [fp1,tmp2];
fp2 = [fp2,tmp1];
end
else
if dif12<dif22
fp1 = [fp1,tmp2];
fp2 = [fp2,tmp1];
else
fp1 = [fp1,tmp1];
fp2 = [fp2,tmp2];
end
end
end
end
然而:
这个appraoch似乎过于复杂,我想知道我是否可以某种方式用适当的算法替换它,例如K均值。但是,在这种情况下,我不知道如何解释角度的模糊性。
代码正在运行,但群集当前仍会在错误的群集中抛出点。我只是找不到原因。
如果有人能告诉我如何使用它来处理像kmeans
这样的内置例程,我将不胜感激。
编辑: 一个小玩具示例: 这可能是我得到的输出:
ang1_stab = [30 10 80 100; 28 15 90 95; 152 93 180 102];
ang2_stab = [150 90 3 100; 145 92 5 95; 32 10 82 102];
我想要实现的目标:
fp1 = [30 10 80 100; 28 15 90 95; 32 10 82 102];
fp2 = [150 90 3 100; 145 92 5 95; 152 93 180 102];
请注意,最后一列已被交换。 另请注意,fp2最后一列中的第三个元素大约是该行中其他元素的平均值,但高出180°。我仍然需要能够确定这是正确的集群。