我需要创建具有分量(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
答案 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
逐行,这是我正在做的事情:
您要求使用此格式[a,b,c] = f(x,y,z)
。我建议使用function xout = orthoVector(xin)
,这会使代码更短。
由于Matlab最好将矢量作为矢量处理,因此我创建了矢量xin
。
e
将是一个随机向量,与用于计算正交向量的xin
不同。由于我们正在处理随机向量,因此我们将其初始化为xin
。
要使此算法有效,我们需要确保e
和xin
指向不同的方向。在这种情况下......
...创建一个新的随机向量e
。请注意,rand将给出介于0和1之间的值。因此,e
的每个组件都介于-1和1之间。
好的,如果我们结束,e
和xin
指向不同的方向
我们的向量xout
将与xin
和e
正交。
让我们将向量xout
乘以1和&#34之间的随机数;非常大"
a
是xout
b
是xout
c
是xout
全部完成。
可选:如果你想拥有非常大的矢量,你可以用
代替第8行xout = exp(1./rand())/(rand()) * xout;
这将为您提供非常大的价值观。
希望这有帮助,欢呼!