public static Matrix DMD(Vector diagmat1, Matrix mat, Vector diagmat2) { if (DMD_selftest) #region selftest { HDebug.ToDo("check"); DMD_selftest = false; Vector td1 = new double[] { 1, 2, 3 }; Vector td2 = new double[] { 4, 5, 6 }; Matrix tm = new double[, ] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; Matrix dmd0 = LinAlg.Diag(td1) * tm * LinAlg.Diag(td2); Matrix dmd1 = LinAlg.DMD(td1, tm, td2); double err = (dmd0 - dmd1).HAbsMax(); HDebug.Assert(err == 0); } #endregion Matrix DMD = mat.Clone(); for (int c = 0; c < mat.ColSize; c++) { for (int r = 0; r < mat.RowSize; r++) { double v0 = mat[c, r]; double v1 = diagmat1[c] * v0 * diagmat2[r]; if (v0 == v1) { continue; } DMD[c, r] = v1; } } return(DMD); }