void TensorInverse(const Tensor<DataMesh>& t, Tensor<DataMesh>& inv) { ASSERT(t.Rank() == 2, "Not a matrix"); ASSERT(t.Dim() == 3, "Not 3D"); ASSERT(t.Structure() == inv.Structure(), "Tensors have different structures"); DataMesh det = t(0,0); TensorDeterminant(t, det); for(int i=0;i<det.Size();i++) { ASSERT(det[i] != 0, "Singular matrix"); } for(TensorIter it(t);it;++it) { IPoint ind = t.Structure().Indices(it.Index()); inv[it] = (t((ind[1]+1)%3,(ind[0]+1)%3) * t((ind[1]+2)%3,(ind[0]+2)%3) - t((ind[1]+1)%3,(ind[0]+2)%3) * t((ind[1]+2)%3,(ind[0]+1)%3)) / det; } }
Tensor<DataMesh> findInverse(const Tensor<DataMesh>& T){ /** Compute the inverse of the given Tensor using a minor expansion. */ const Mesh m(T(0).Extents()); DataMesh det = computeDet(T); for(int k=0;k<det.Size();k++){ REQUIRE(det[k]>1e-15 || det[k]<1e-15,"determinant is too close to zero!\n"); } //The inverse of a symmetric matrix is symmetric: Tensor<DataMesh> inverse(3,"aa",m,0.0); inverse(0,0) = (T(1,1)*T(2,2)-T(1,2)*T(2,1))/det; inverse(0,1) = -(T(1,0)*T(2,2)-T(1,2)*T(2,0))/det; inverse(0,2) = (T(1,0)*T(2,1)-T(1,1)*T(2,0))/det; inverse(1,1) = (T(0,0)*T(2,2)-T(0,2)*T(2,0))/det; inverse(1,2) = -(T(0,0)*T(2,1)-T(0,1)*T(2,0))/det; inverse(2,2) = (T(0,0)*T(1,1)-T(0,1)*T(1,0))/det; return inverse; }