我想做一个表达式的点积,它应该是对称的。你知道吗
事实证明,事实并非如此
B是一个4D数组,我必须将它的最后两个维度转换成B^t
D是一个二维数组。(这是有限元法程序员已知的刚度矩阵表达式)
与numpy.transpose
相关联的numpy.dot
产品,以及作为第二种选择numpy.einsum
(这个想法来自于这个主题:Numpy Matrix Multiplication U*B*U.T Results in Non-symmetric Matrix)已经被使用,并且问题仍然存在。你知道吗
在计算结束时,得到了乘积B^tDB,当通过减去它的转置B^tDB来验证它是否真的是对称的时,仍然有一个余数。你知道吗
点积或爱因斯坦求和仅用于感兴趣的维度(最后一个维度)。你知道吗
问题是:如何消除这些残留物?你知道吗
您需要使用任意精度浮点数学。下面是如何结合} package 来定义任意精度的矩阵乘法(即
numpy
和^{np.dot
方法):例如,如果随后将B、B^t和D矩阵设置为:
然后B^tDB-(B^tDB)^t将始终具有非零值,如果您使用标准矩阵乘法方法从
numpy
计算它:但是,如果使用上面给出的任意精度版本,它将不会有残留物:
不过要小心。使用任意精度数学的计算比使用标准浮点数的计算慢得多。你知道吗
相关问题 更多 >
编程相关推荐