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 https://web.archive.org/web/20100409071145/innovatian.com/2010/03/parallel-matrix-multiplication-with-the-task-parallel-library-tpl
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!!!
Edição em 2022-04-26: O artigo referênciado não existe mais na URL original, e não encontramos para onde tenha mudado... mas existe essa cópia no muito útil web.archive.org. Atualizamos os links para apontar para essa versão salva.