如何在MATLAB中找到另一个向量的任意垂直向量?

时间:2015-08-06 16:05:03

标签: matlab vector geometry

我需要创建具有分量(a,b,c)的任意垂直向量n到具有分量(x,y,z)的另一个已知向量k。 下面的代码创建了任意向量n,但我需要[-inf,inf]范围内组件的随机数,我该如何实现呢? (因为否则创建的向量组件在给定的情况下可能不会超过某个值10 ^ 11)或者概念“任意向量”不需要那个?

function [a,b,c] = randomOrghogonalVector(x,y,z)
a = 0;
b = 0;
c = 0;
randomDistr = rand * 10^11 * 2 - 10^11; % issue 1
% excluding trivial solution
if x == 0 && y == 0 && z ==0 
    a = NaN;   b = a;   c = a;
else
    if z ~=0
        a = randomDistr;
        b = randomDistr; 
        c = - (x * a + b * y ) / z;
    else
        if z == 0 && x ~= 0
            c = randomDistr;
            b = randomDistr; 
            a = - (z * c + b * y ) / x;   
        else
            if z == 0 && x == 0 && y ~= 0
                c = randomDistr;
                a = randomDistr; 
                b = - (z * c + a * x ) / y;   
            end
        end
    end
end

1 个答案:

答案 0 :(得分:1)

我看到的最简单的解决方案是首先找到一个与原始矢量正交的随机向量,然后给它一个随机长度。在Matlab中,这可以通过定义以下函数来完成

function [a, b, c] = orthoVector(x, y, z)
    xin = [x;y;z];
    e = xin;
    while ((e'*xin)==xin'*xin)
        e = 2.*rand(3,1)-1;
    end
    xout = cross(xin, e);
    xout = 1.0/(rand()) * xout;
    a = xout(1);
    b = xout(2);
    c = xout(3);
end

逐行,这是我正在做的事情:

  1. 您要求使用此格式[a,b,c] = f(x,y,z)。我建议使用function xout = orthoVector(xin),这会使代码更短。

  2. 由于Matlab最好将矢量作为矢量处理,因此我创建了矢量xin

  3. e将是一个随机向量,与用于计算正交向量的xin不同。由于我们正在处理随机向量,因此我们将其初始化为xin

  4. 要使此算法有效,我们需要确保exin指向不同的方向。在这种情况下......

  5. ...创建一个新的随机向量e。请注意,rand将给出介于0和1之间的值。因此,e的每个组件都介于-1和1之间。

  6. 好的,如果我们结束,exin指向不同的方向

  7. 我们的向量xout将与xine正交。

  8. 让我们将向量xout乘以1和&#34之间的随机数;非常大"

  9. axout

  10. 的第一个组成部分
  11. bxout

  12. 的第二个组成部分
  13. cxout

  14. 的第三个组成部分
  15. 全部完成。

  16. 可选:如果你想拥有非常大的矢量,你可以用

    代替第8行
    xout = exp(1./rand())/(rand()) * xout;
    

    这将为您提供非常大的价值观。

    希望这有帮助,欢呼!