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.

Share