Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 强力循环,计算出旋转矩阵_Matlab_Loops - Fatal编程技术网

Matlab 强力循环,计算出旋转矩阵

Matlab 强力循环,计算出旋转矩阵,matlab,loops,Matlab,Loops,我试图通过循环来强制旋转矩阵。基本上,我在两个不同的坐标系中有一组点(准确地说是6个点),我想尝试一组旋转矩阵,它们的欧拉角值不同,以便在这些点之间找到匹配。但我最大的问题是,坐标变换中还涉及到一个平移。这就是让我陷入困境的部分。这是我的尝试 %Point 1 (Between two front teeth) Vector_Endo1 = [-8.9329*voxTommConversion;8.5058*voxTommConversion;117.7193*voxTommConversion

我试图通过循环来强制旋转矩阵。基本上,我在两个不同的坐标系中有一组点(准确地说是6个点),我想尝试一组旋转矩阵,它们的欧拉角值不同,以便在这些点之间找到匹配。但我最大的问题是,坐标变换中还涉及到一个平移。这就是让我陷入困境的部分。这是我的尝试

%Point 1 (Between two front teeth)
Vector_Endo1 = [-8.9329*voxTommConversion;8.5058*voxTommConversion;117.7193*voxTommConversion];
voxPoint1 = [418.7801;41.3845;231.3922];

%Point 2 (Mid-left skull, portruding bone on bottom)
Vector_Endo2 = [-11.2102*voxTommConversion;112.4456*voxTommConversion;61.3865*voxTommConversion];
voxPoint2 = [444;275.3698;99.7672];

%Point 3 (Cavity on top, front, middle, right of head, pointed section)
Vector_Endo3 = [140.0249*voxTommConversion;95.0548*voxTommConversion;148.9631*voxTommConversion];
voxPoint3 = [79.6156;255.4725;259.3405];

%Point 4 (Between two molars on left side)
Vector_Endo4 = [-9.4742*voxTommConversion;42.4474*voxTommConversion;87.0998*voxTommConversion];
voxPoint4 = [428.7617;118.7252;158.994];

%Point 5 (Left large stub inside of head)
Vector_Endo5 = [42.2453*voxTommConversion;85.6763*voxTommConversion;105.5044*voxTommConversion];
voxPoint5 = [309.3354;221.2764;187.5172];

%Point 6 (Thin portruding point underneath right side of skull)
Vector_Endo6 = [1.3304*voxTommConversion;101.7924*voxTommConversion;157.7978*voxTommConversion];
voxPoint6 = [390.7929;259.3982;311.4098];

allPoints=[Vector_Endo1,Vector_Endo2,Vector_Endo3,Vector_Endo4,Vector_Endo5,Vector_Endo6];

%testVector is used to compare difference between computed offset and real offset
for Rx=0:pi/180:2*pi,
    for Ry=0:pi/180:2*pi,
        for Rz=0:pi/180:2*pi,
            for points = 1:length(allPoints)
                testVector=euler2rotmat(Rx,Ry,Rz)*allPoints(:,points);
                allTestVectors(:,i)=testVector;
我想这会给我所有需要的旋转矩阵(某种近似值)。我将继续编写一些代码,找到旋转矩阵,它给出了测试向量和实际点(allPointsVox)之间最小的幅度差异…这应该在旋转矩阵之后实现。唯一的问题是,在我所拥有的和确定价值之间有一个中间步骤

关于如何找到坐标系之间的近似平移值,有什么想法吗?我想对所有的值取平均值,得到一个平均值,但我不知道该怎么做


非常感谢任何其他提示,谢谢

您可以从每个集合中减去点坐标的质心,从而消除平移效果。

我希望我能做到这一点!不幸的是,这个问题最困难的部分是我无法测量这个距离。否则我就不需要使用这个循环来“猜测”一个解决方案,并且可以准确地找到它。你能解释一下为什么它是不可能的吗?如果你有一个点矩阵,那么找到质心应该很容易,就像
平均值(所有点)
@JohnDodson你觉得Alan的评论怎么样?因为我只知道该坐标系中的所有点,而不知道另一个。我无法将该坐标系的质心转移到另一个坐标系,因为在两个坐标系之间没有旋转矩阵或变换systems@JohnDodson-点是从各集合中减去各集合的质心。因此,减法运算与其他点集无关。减法的结果是两个集合(在不同的坐标系中),但这两个集合都以各自坐标系的(0,0,0)点为中心,因此消除了平移元素。如果您有图像处理工具箱,则Matlab有内置的:如果没有,则谷歌仿射图像配准算法。FEX上也有免费提供的工具箱,可以实现这一点。您为什么希望使用蛮力方法,而不仅仅是计算转换的参数?这是常见的问题(匹配两个点云并找到它们之间的转换)以现有的解决方案为例,就像某个拥有博士学位并在内镜技术领域工作了10年的家伙告诉我的那样,lol…。不能说这是最好的方法。蛮力对我来说听起来是最差的方法。我知道其他方法,比如你给我展示的方法,但他坚持我使用循环,我认为这与发现错误等有关……如果你能帮我解释一下,而不是告诉我其他方法。我们非常了解它们,事实上我已经下载了KoordTransform3D,这非常好,并完成了这项工作,但我们需要其他信息