【问题标题】:How to compute orthogonal vector in python?如何在python中计算正交向量?
【发布时间】:2013-06-22 06:08:16
【问题描述】:

我有以下代码来计算来自 i,j 维矩阵的输入的每个向量的正交向量。所以矩阵中的每一行都是一个向量。代码如下:

for i in range(data.shape[0]):
          for j in range(data.shape[1]):
              s=0 #row counter set to 0
              if j == data.shape[1]-1: #check if last row element has been reached
                  for k in range(j): #compute the sum of all previous values.
                      s=s+data2[i][k]*data[i][k]
                  data2[i][j] = -s/data[i][k]
              else:
                  data2[i][j] = random.uniform(1,random.getrandbits(10))
          dot(data[i],data2[i])

但它不起作用,因为 dot 函数很少返回 0,这应该是在向量正交的情况下。我看不到代码逻辑的流程。我简单地为正交向量的系数固定 j-1 个随机元素,然后为了找到最后一个系数,我求解一个简单的方程,它是随机元素的先前系数与向量系数除以的点积最后一个系数。 a1r1+a2r3+...+anrn=0。我知道ai的。我修复随机 i-1 ri,然后解决 1 var 方程线性问题以找到 rn suth,而不是 ri 向量与 a1 向量正交。我得到的最后一个点积计算的结果是这样的:

===================================================
8.90285882653
===================================================
15.1275777619
===================================================
25.0847305913
===================================================
30.8608285102
===================================================
35.2496752739
===================================================
-53.3796252747
===================================================
16.302777
===================================================
29.3607765359
===================================================
-39.8982101139
===================================================
42.97222625

【问题讨论】:

  • dot 的结果有多大?对于浮点数,您不太可能得到完全为零的结果——通常,您的数据类型会得到大约为 epsilon 的数字(1e-16 表示双精度)。
  • 我在问题中添加了结果
  • 问题是我什至没有得到接近 0 的结果
  • 是的,这些都不是很接近 :) 绝对是某个地方的问题。现在是我希望我更好地记住我的线性代数的时候了...... :)
  • @mgilson 我修复了下面的代码,但我在 0 之间得到了一些奇怪的结果。所以点积并不总是 0。这是怎么回事?我可以强制点积达到特定的精度,这样我就可以摆脱这个奇怪的结果了。

标签: python numpy geometry linear-algebra


【解决方案1】:

这行得通。我编辑了一点你的代码(去掉了现在称为商的 var s),但唯一的错误是在 k 到向量的总长度减去 2 的范围内,而不是到倒数第二个一个元素。无论如何请注意,此方法并不可靠。

for i in range(data.shape[0]):
      for j in range(data.shape[1]):
          if j == data.shape[1]-1: #check if last row element 
              quotient=(data2[i][:-1]*data[i][:-1]).sum()
              data2[i][j] = -quotient/data[i][-1]
          else:
              data2[i][j] = random.uniform(1)
      print dot(data[i],data2[i])

【讨论】:

  • 现在我正在获得“更好的结果”但仍然存在一些不一致:0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.054273576E-15 0.0 0.0.0.01.0.0108547152 e-14 0.0 0.0 0.0 1.42108547152e-14 0.0
  • 我不太清楚。这取决于我是否得到 0?我可以解决这个问题吗?例如,为什么我会得到这个 -7.105...?
  • 您的意思是,在 2013 年的计算机中,由于表示中的浮点错误,您在简单数学中会出现错误?我仍然无法理解,我印象深刻。而且我得到的错误远离 0...(?)
  • 还有哪一种是稳健的方法?
  • @curious -7.1054273576e-150.0000000000000071054273576 相同,因此您得到的错误并不远离 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2022-01-05
  • 1970-01-01
  • 2020-05-19
  • 2015-10-08
相关资源
最近更新 更多