Matlab 创建一组正交轴

Matlab 创建一组正交轴,matlab,axes,orthogonal,Matlab,Axes,Orthogonal,我需要为模拟创建一系列向量,这些向量给出传播方向和光的偏振(3维)。因为方向和极化必须是正交的,所以我需要这样的东西: D= [dir1; P=[pol11; dir1; pol12; dir2; pol21; dir2; pol21; dir3; pol31; .... ] ... ] 正如你所看到的,每个方向都有两个极化。这里重要的是dir1*pol11'=0,dir1*p

我需要为模拟创建一系列向量,这些向量给出传播方向和光的偏振(3维)。因为方向和极化必须是正交的,所以我需要这样的东西:

D= [dir1;     P=[pol11;
   dir1;         pol12;
   dir2;         pol21;
   dir2;         pol21;
   dir3;         pol31;
   .... ]        ...  ]
正如你所看到的,每个方向都有两个极化。这里重要的是dir1*pol11'=0,dir1*pol12'=0,依此类推。方向应该跨越整个立体角,而偏振方向并不是严格意义上的重要方向,不过如果它们彼此正交,那就更好了。我尝试了两种不同的方法,一种是创建一个基本正交基并旋转它,另一种是创建一个方向矩阵并使用null()函数来创建偏振。在这两种情况下,我得到的是,如果我做D*P,我得到的是一系列0,但其中一些值不是零-非常小(例如1e-17),但仍然不是零。 代码1:

代码2:

bDir=[1,0,0;1,0,0]
dir=bDir
pol=[0,1,0;0,0,1]
for phi=0:pi/5:2*pi
    for theta=0:pi/5:pi
        rotatePhi=[cos(phi) -sin(phi) 0;...
                         sin(phi) cos(phi) 0;...
                         0 0 1];
        rotateTheta=[cos(theta) 0 sin(theta);...
                              0 1 0;...
                              -sin(theta) 0 cos(theta)];
        rDir=bDir*rotateTheta*rotatePhi;
        rPol=null(rDir)';

        dir=vertcat(dir,rDir);
        pol=vertcat(pol,rPol);

    end
end
我认为问题在于matlab引入了一些精度误差,但可能是错误的。
有人能告诉我我的代码中是否有错误,或者是否有更好的方法来获得我正在寻找的两个矩阵吗?

我想你对我的期望有点低。浮点运算不精确。在MATLAB中,浮点算术运算通常只精确到16位小数(
1e-16
)。任何小于此值的值通常都可视为
0

MATLAB中的函数可用于确定MATLAB能够表示的最小浮点数。在我的系统上,它产生

>> eps
ans =

   2.2204e-16
任何小于此值的数字都无法准确表示


除了浮点运算的精度外,将它们与
0
的整数值进行比较通常也是错误的。更准确的比较是

if dir*pol < 1e-16
    fprintf(1, 'Orthogonal\n');
else
    fprintf(1, 'Not Orthogonal\n');
end
if dir*pol<1e-16
fprintf(1,'正交\n');
其他的
fprintf(1,'非正交\n');
结束
在大多数情况下,当使用浮点运算时,通常在MATLAB中给定上述
eps
输出,任何小于
2.2204e-16
的值都有效地
0



如果您确实需要可变精度算法,可以使用。但是,它通常是不必要的,只要您知道它的缺点,浮点运算就足够了。

谢谢您的回答。我意识到了“局限性”。我的问题是,我没有直接使用这些值,而是使用它们作为工具箱的输入。我猜,工具箱会检查偏振方向是否正交,如果发现不是正交方向,则返回错误。我不能改变工具箱(如果可以的话,我不确定结果会是什么),所以我实际上在寻找一种替代方法来获得方向和极化。任何替代方法都会在我的答案中遇到同样的问题。
if dir*pol < 1e-16
    fprintf(1, 'Orthogonal\n');
else
    fprintf(1, 'Not Orthogonal\n');
end