Умножение трех матриц в BLAS, средняя из которых является диагональной.

A — матрица MxK, B — вектор размера K, а C — матрица KxN. Какой набор операторов BLAS следует использовать для вычисления приведенной ниже матрицы?

M = A*diag(B)*C

Один из способов реализовать это — использовать три цикла for, как показано ниже.

for (int i=0; i<M; ++i)
    for (int j=0; j<N; ++j)
        for (int k=0; k<K; ++k)
            M(i,j) = A(i,k)*B(k)*C(k,j);

Действительно ли стоит реализовать это в BLAS, чтобы повысить эффективность скорости?


person D R    schedule 23.08.2010    source источник
comment
Стоит ли оно того? Насколько велики ваши матрицы?   -  person David Heffernan    schedule 18.02.2011


Ответы (1)


Сначала вычислите D = diag(B)*C, затем используйте соответствующее умножение матрицы BLAS для вычисления A*D.

Вы можете реализовать diag(B)*C, используя цикл по элементам B и вызывая соответствующую процедуру скалярного умножения BLAS.

person Stephen Canon    schedule 17.02.2011
comment
Нет оптимизированной процедуры для умножения матрицы на матрицу и матрицы на вектор, когда одна из матриц является диагональной? Это невероятно. - person enigmaticPhysicist; 12.03.2014
comment
См. также этот ответ, который указывает на функции ?sbmv для работы с полосовыми матрицами, такими как диагональные матрицы. Судя по звуку, это вряд ли даст хорошую производительность. stackoverflow.com/a/13433038 - person Max Barraclough; 30.03.2021