public static unsafe double[][] Dot(this long[,] a, double[][] b, double[][] result) { int N = result.Length; int K = a.Columns(); int M = result.Columns(); var t = new double[K]; fixed(long *A = a) for (int j = 0; j < M; j++) { for (int k = 0; k < t.Length; k++) { t[k] = b[k][j]; } long *pa = A; for (int i = 0; i < N; i++) { double s = (double)0; for (int k = 0; k < t.Length; k++) { s += (double)((double)(*pa++) * (double)t[k]); } result[i][j] = (double)s; } } return(result); }