Multiplicação de Matrizes
Nos últimos dias, ao trabalhar com matrizes, nos deparamos com o ótimo artigo Parallel Matrix Multiplication with the Task Parallel Library (TPL) que mostra comparações entre algoritmos de multiplicação de matrizes. Aproveitamos e incorporamos o mais rápido entre eles (para uma thread), Jagged Optimized, em nosso sistema. Apenas alterando para que aceitasse matrizes de diferentes tamanhos.
////// Multiplica a matriz A pela B /// /// A matriz A /// A matriz B ///A matriz produto public static Matrix operator *(Matrix a, Matrix b) { if (a.Cols != b.Rows) { throw new ArgumentException( string.Format( @"Para a multiplicação de matrizes o número de colunas de A deve ser igual ao número de linhas de B, mas C(A) = {0} e L(B) = {1}", a.Cols, b.Rows)); } int l = a.Rows; int c = b.Cols; int ac = a.Cols; var r = new Matrix(l, c); // Altamente otimizado, adaptado de http://bit.ly/9ltCuH // (O endereço foi encurtado para não afetar as bordas deste post). int i = 0; do { int k = 0; do { int j = 0; do { double[] ri = r._array[i]; ri[j] = (a._array[i][k]*b._array[k][j]) + ri[j]; j++; } while (j < c); k++; } while (k < ac); i++; } while (i < l); return r; }
Você pode deduzir que a class Matrix possuí internamente um double[][] _array e a construção do número de linhas e colunas são feitas na inicialização da mesma.
Enjoy!!!