如何在ParaView中用Python计算3×3矩阵的特征值平方根并修正代码
解决批量3×3矩阵的F*F^T计算问题
你遇到的核心问题是批量矩阵乘法的维度匹配错误,根源在于错误的转置方式和元素级乘法的误用。让我一步步帮你修复:
错误原因拆解
你的F.Arrays[0]形状是(60,3,3),代表60个独立的3×3矩阵。但你用.T转置时,它会反转整个数组的维度顺序,得到(3,3,60)——这完全不是你需要的(你要的是每个3×3矩阵单独转置,而非整个数组转置)。同时,*是numpy的元素级乘法,不是矩阵乘法,这直接导致了维度无法广播的报错。
修复后的完整代码
import numpy as np import vtk from vtk.numpy_interface import dataset_adapter as da from paraview.numpy_support import vtk_to_numpy from paraview.vtk.numpy_interface import algorithms from paraview.vtk.numpy_interface.algorithms import sqrt as sqrt from paraview.vtk.numpy_interface.algorithms import eigenvalue as eigenvalue # 获取VTK复合数据数组 F = inputs[0].GetCellData().GetArray('F') # 1. 对每个3×3矩阵单独转置(保留批量维度不变) F_transposed = F.Arrays[0].transpose(0, 2, 1) # 形状仍为(60,3,3) # 2. 用批量矩阵乘法计算每个F * F^T C = np.matmul(F.Arrays[0], F_transposed) # 也可以用简洁的@运算符:C = F.Arrays[0] @ F_transposed # 计算特征值的平方根 Eigs = sqrt(eigenvalue(C)) # 将结果追加到输出 output.CellData.append(Eigs, "EigenValues")
关键细节说明
transpose(0,2,1):专门针对每个批量元素(第0维),交换后两个维度实现单个3×3矩阵的转置,数组整体形状保持(60,3,3),完美匹配后续乘法要求np.matmul或@:支持批量矩阵乘法,会自动对第0维的每个元素执行3×3矩阵的乘法操作,最终C的形状还是(60,3,3),每个元素都是对应的F*F^T结果- 后续的
eigenvalue和sqrt函数能正确处理批量矩阵的特征值计算,最终得到每个单元的特征值平方根数组
内容的提问来源于stack exchange,提问作者Caslu
相关产品推荐
相关产品推荐

