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!!!

Share