Python 叉积与行列式

Python 叉积与行列式,python,numpy,vector,scientific-computing,pyqtgraph,Python,Numpy,Vector,Scientific Computing,Pyqtgraph,我正在尝试使用pyqtgraph和numpy在Python中使用等值面来确定三维体积的表面积。问题不在于生成等值面,而在于根据矢量计算面积 如果理解正确,2个向量的叉积(A X B)的大小表示它们定义的平行图的面积。 类似地,3x3矩阵的行列式(其中第一行为单位向量)确定由其他两行定义的向量的平行图的面积 我正在使用下面的代码,但我得到了不同的答案(尽管大小相同) 185088.05 289059.69600568933 有人知道这是怎么回事吗 下面是我正在使用的完整Python代码 #impo

我正在尝试使用pyqtgraph和numpy在Python中使用等值面来确定三维体积的表面积。问题不在于生成等值面,而在于根据矢量计算面积

如果理解正确,2个向量的叉积(A X B)的大小表示它们定义的平行图的面积。 类似地,3x3矩阵的行列式(其中第一行为单位向量)确定由其他两行定义的向量的平行图的面积

我正在使用下面的代码,但我得到了不同的答案(尽管大小相同)

185088.05

289059.69600568933 有人知道这是怎么回事吗

下面是我正在使用的完整Python代码

#import tiff file
print("Loading volume...")
img = tifffile.imread(r"C:\Users\Nachiket\Desktop\C1-confocal-series.tif")
print("Done")
print("Generating isosurface...")
verts, faces = pg.isosurface(img, img.max()/5.)
print("Done")


#creating an indexed array of vertices
tris = verts[faces]

#calculate area from normals
n = np.cross( tris[::,1 ] - tris[::,0]  , tris[::,2 ] - tris[::,0] )
narea = np.linalg.norm(n, ord=1)

#calculate determinant using unit vectors

triedges = np.zeros(tris.shape)

triedges[::,0]=([[1,1,1]])  #unit vectors
triedges[::,1]=(tris[::,1] - tris[::,0])
triedges[::,2]=(tris[::,2] - tris[::,0])

triarea = np.abs(np.linalg.det(triedges))
tot = np.sum(np.abs(triarea))

我认为triedges索引值的分配方式是造成问题的原因

而不是这个

triedges[::,0]=([[1,1,1]]) #unit vectors
triedges[::,1]=(tris[::,1] - tris[::,0])
triedges[::,2]=(tris[::,2] - tris[::,0])


要使行列式表示面积,必须沿矩阵的行定义向量,但要将向量臂指定给矩阵的列

不,不是这样。triedges是一个大堆栈n x 3 x 3,其中n表示三角形的数量,并沿第0列计算。请参见屏幕截图:
#import tiff file
print("Loading volume...")
img = tifffile.imread(r"C:\Users\Nachiket\Desktop\C1-confocal-series.tif")
print("Done")
print("Generating isosurface...")
verts, faces = pg.isosurface(img, img.max()/5.)
print("Done")


#creating an indexed array of vertices
tris = verts[faces]

#calculate area from normals
n = np.cross( tris[::,1 ] - tris[::,0]  , tris[::,2 ] - tris[::,0] )
narea = np.linalg.norm(n, ord=1)

#calculate determinant using unit vectors

triedges = np.zeros(tris.shape)

triedges[::,0]=([[1,1,1]])  #unit vectors
triedges[::,1]=(tris[::,1] - tris[::,0])
triedges[::,2]=(tris[::,2] - tris[::,0])

triarea = np.abs(np.linalg.det(triedges))
tot = np.sum(np.abs(triarea))
triedges[::,0]=([[1,1,1]]) #unit vectors
triedges[::,1]=(tris[::,1] - tris[::,0])
triedges[::,2]=(tris[::,2] - tris[::,0])
triedges[0, ::]=([[1,1,1]]) #unit vectors
triedges[1, ::]=(tris[1, ::] - tris[0, ::])
triedges[2, ::]=(tris[2, ::] - tris[0, ::])