【问题标题】:Generate a vector that is orthogonal to a set of other vectors in any dimension生成与任意维度上的一组其他向量正交的向量
【发布时间】:2018-06-03 04:45:10
【问题描述】:

假设我有一组向量 $ a_1, ..., a_d $ 彼此正交。现在,我想找到另一个与所有其他向量正交的向量 $ a_{d+1} $。

  1. 是否有有效的算法来实现这一点?我只能想到在最后加一个随机向量,然后应用gram-schmidt。

  2. 是否有一个 python 库已经实现了这一点?

【问题讨论】:

  • 为什么不能取所有向量的一般wege积?如果它们都是n维,并且你有n-1个,那么你可以取所有它们的叉积得到最后一个正交向量
  • 其实很好……没想到。对于任何类型的向量都是如此吗?另外,如果我有“n-2”个向量,但有“n”个维度,是否也可以?
  • 取叉积并不是 gram schmidt 的工作原理
  • 我知道...但是,modesitt 的观点很容易找到第 n 个正交向量,因为您有 n-1 个向量

标签: python matrix orthogonal


【解决方案1】:

Related。不能说最优,但这是一个可行的解决方案。好消息是 numpy.linalg 完成了所有繁重的工作,因此这可能比手动执行 Gram-Schmidt 更快、更健壮。此外,this 表明复杂度并不比 Gram-Schmidt 差。

想法:

  1. 将输入正交向量视为矩阵O 的列。
  2. O 添加另一个随机列。通常O 将保持一个满秩矩阵。
  3. 选择b = [0, 0, ..., 0, 1]len(b) = d + 1
  4. 解决最小二乘问题x O = b。然后,x 保证为非零且与O 的所有原始列正交。

import numpy as np
from numpy.linalg import lstsq
from scipy.linalg import orth

# random matrix
M = np.random.rand(10, 5)

# get 5 orthogonal vectors in 10 dimensions in a matrix form
O = orth(M)


def find_orth(O):
    rand_vec = np.random.rand(O.shape[0], 1)
    A = np.hstack((O, rand_vec))
    b = np.zeros(O.shape[1] + 1)
    b[-1] = 1
    return lstsq(A.T, b)[0]


res = find_orth(O)

if all(np.abs(np.dot(res, col)) < 10e-9 for col in O.T):
    print("Success")
else:
    print("Failure")

【讨论】:

  • 非常感谢! :) 但是,我不明白您为什么选择 b 并求解 x?我的意思是,在 w 将随机列添加到 O 之后,我们无法更改 O,但是我们想要属性 np.dot( O.T, O ) = I,对吧?
  • 我想我可以更好地表达它。我们临时“添加”一个随机列。然后我们求解与所有原始列正交但不是随机列的x。特别是,x 不为零。所以 x 在你的术语中对应于 a_{d+1} 。 BTW np.dot(O.T, O) = I 意味着向量是正交的。正交向量会导致对角矩阵。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多