Python中两个向量的叉积

25

如何在不使用编程库的情况下计算两个向量的叉积?

例如,给定向量 a = (1, 2, 3)b = (4, 5, 6)


8
叉积的公式可以在http://mathworld.wolfram.com/CrossProduct.html找到。如果您仍然遇到编程问题,请阅读该网页后再回来。 - Greg Hewgill
6个回答

60

你是在询问叉积公式还是如何在Python中进行索引和列表操作?

基本思想是通过a[0]、a[1]、a[2]等方式访问a和b的元素(x、y、z),然后创建一个新的列表[element_0,element_1,...]。我们也可以将其封装在函数中。

对于向量,叉积是元素的反对称积,同时具有很好的几何解释。

无论如何,最好给你一些提示并让你自己解决,但这不是SO的方式,所以...

def cross(a, b):
    c = [a[1]*b[2] - a[2]*b[1],
         a[2]*b[0] - a[0]*b[2],
         a[0]*b[1] - a[1]*b[0]]

    return c

10
没问题,不过没必要逐个感谢我们。不过你可以“接受”其中一个答案——暗示,暗示…… - Andrew Jaffe

41
import numpy as np
a = np.array([1,0,0])  
b = np.array([0,1,0])  
#print the result    
print(np.cross(a,b))

15
虽然并非符合要求的答案,但是保罗说得有道理:如果您需要那种东西,确实应该考虑使用numpy!此外,如果你在研究中正在处理三维向量,可以试试VPython - 它使得可视化这些事情变得非常容易和有趣。 - Beni Cherniavsky-Paskin
匿名编辑者试图添加这个,我认为应该是一个注释:所以你得到的答案是[0 0 1],用户可以将其收集为(0i+0j+0k),作为给定的两个向量的叉积。 - JeffUK

2

1

对于多维数组,这可能有效;

    def crossProd(a,b):
      dimension = len(a)
      c = []
      for i in range(dimension):
        c.append(0)
        for j in range(dimension):
          if j <> i:
            for k in range(dimension):
              if k <> i:
                if k > j:
                  c[i] += a[j]*b[k]
                elif k < j:
                  c[i] -= a[j]*b[k]
      return c

2
这个问题可以考虑使用递归解决,这样会更加优雅。 - Sardathrion - against SE abuse
2
你可能想使用!=而不是<>。 - Amir Md Amiruzzaman

1
我是这样做的:

def cross_product(u,v):  
    dim = len(u)
    s = []
    for i in range(dim):
        if i == 0:
            j,k = 1,2
            s.append(u[j]*v[k] - u[k]*v[j])
        elif i == 1:
            j,k = 2,0
            s.append(u[j]*v[k] - u[k]*v[j])
        else:
            j,k = 0,1
            s.append(u[j]*v[k] - u[k]*v[j])
    return s

1
在教学的精神下:这是一种相当糟糕的方法——循环实际上并没有做任何事情,因为按顺序检查了三个不同的索引,每个索引都按顺序附加到现有结果!可以直接这样做,例如s.append(u[1]*v[2] - u[2]*v[1]); s.append(u[2]*v[0] - u[0]*v[2]); s.append(u[0]*v[1] - u[1]*v[0]) - Andrew Jaffe

0

我定义了一个名为z的后继函数,这有助于以稍微简洁的方式编写叉积公式。以下是代码:

    from numpy import zeros
    def z(a):
      if a == 0 or a == 1:
       return a+1
      elif a == 2:
       return 0
    n = 3
    i = 0
    v = zeros(n, float)
    v1 = zeros(n, float)
    v2 = zeros(n, float)
    v1[0] = float(input("enter x component of v1 "))
    v1[1] = float(input("enter y component of v1 "))
    v1[2] = float(input("enter z component of v1 "))
    v2[0] = float(input("enter x component of v2 "))
    v2[1] = float(input("enter y component of v2 "))
    v2[2] = float(input("enter z component of v2 "))


    def cp(x, y):
     global i
     while i < n:
      v[i] = x[z(i)]*y[z(z(i))]-x[z(z(i))]*y[z(i)]
      i = i + 1
     return v


    ans = cp(v1, v2)
    print(ans)

感谢您为SO做出的贡献。这可能有所帮助,但您没有回答问题,也没有避免使用库,如numpy,不符合要求。下次请仔细阅读问题。 - MjH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接