与给定向量形成正交基的矩阵

时间:2010-06-29 11:12:38

标签: algorithm math geometry linear-algebra

线性代数问题;

给出k变量的赋范向量u(即u:|| u || _2 = 1) 你如何构造\ Gamma_u,任意k *(k-1) 单位向量矩阵使得(u,\ Gamma_u)形成一个  正交基础?

我的意思是:从计算的立场来看: 你用什么算法来构造这样的矩阵?

提前致谢,

2 个答案:

答案 0 :(得分:4)

天真的方法是应用u_0和k-1随机生成的向量的Gram Schmidt正交化。如果在某些时候GS算法生成零向量,那么你有一个线性依赖,在这种情况下,再次随机选择向量。

然而,这种方法不稳定,矢量表示中的小数值误差被放大。然而,该算法存在稳定的修改:

a_1 = u, a_2,...a_k成为随机选择的向量

for i = 1 to k do 
        vi = ai
end for 

for i = 1 to k do
    rii = |vi| 
    qi = vi/rii
    for j = i + 1 to k do
       rij =<qi,vj>
       vj =vj −rij*qi 
    end for
end for

生成的向量v1,...vk将是矩阵的列,v1 = u。如果在某个时刻vj变为零,请选择一个新的向量aj并重新开始。请注意,如果随机选择向量a2,..,ak,则发生这种情况的概率可以忽略不计。

答案 1 :(得分:2)

您可以使用Householder矩阵来执行此操作。看看 示例http://en.wikipedia.org/wiki/Householder_reflectionhttp://en.wikipedia.org/wiki/QR_decomposition

可以找到一个Householder矩阵Q,以便Q*u = e_1 (其中e_k是除了第k个位置1之外的全0的向量) 然后,如果f_k = Q*e_k,则f_k形成正交基础和f_1 = u。 (自Q*Q = I以来,Q是正交的。)

所有这些关于矩阵的讨论都可能使它成为常规 会很贵,但事实并非如此。例如这个C函数, 给定长度为1的向量将返回具有所需基础的数组 按列顺序,即第i个向量的第j个分量保存在b [j + dim * i]

   double*  make_basis( int dim, const double* v)
{
    double* B = calloc( dim*dim, sizeof * B);
    double* h = calloc( dim, sizeof *h);
    double  f, s, d;
    int i, j;

    /* compute Householder vector and factor */
    memcpy( h, v, dim*sizeof *h);
    s = ( v[0] > 0.0) ? 1.0 : -1.0;
    h[0] += s;  
    f = s/(s+v[0]);

    /* compute basis */
    memcpy( B, v, dim * sizeof *v); /* first one is v */
    /* others by applying Householder matrix */
    for( i=1; i<dim; ++i)
    {   d = f*h[i];
        for( j=0; j<dim; ++j)
        {   B[dim*i+j] = (i==j) - d*h[j];
        }
    }
    free( h);
    return B;
}