2015-04-06 11 views
6

BLAS definisce l'operazione di livello 2 GEMV (moltiplicazione vettoriale-matrice). Come utilizzare una libreria BLAS per eseguire la moltiplicazione di matrice vettoriale?Come eseguire la moltiplicazione di matrice vettoriale con BLAS?

È probabilmente ovvio, ma non vedo come utilizzare l'operazione BLAS per questa moltiplicazione. Mi sarei aspettato un'operazione GEVM.

+4

trasposizione (x). trasporre (A) = A.x – talonmies

risposta

7

La moltiplicazione Matrix-Vector di una matrice (M x N) con un vettore (N x 1) provocherà un vettore (M x 1). In breve a*A(MxN)*X(Nx1) + b*Y(Mx1) -> Y(Mx1). Naturalmente è possibile utilizzare INCX e INCY quando il vettore è incluso in una matrice.

Per definire una moltiplicazione della matrice vettoriale, è necessario trasporre il vettore. vale a dire . Fondamentalmente non hai un vettore ma una matrice a riga singola.

A partire da questo punto ci sono due possibilità.

usare sia di livello 3 "GEMM"

?gemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc) 

utilizzando

?gemm('N', 'N', 1, N, M, a, X, 1, A, M, b, Y, 1) 

O fare un po 'più matematica. Considerando che (X*A)^T = A^T * X^T la matrice di righe X viene convertita in vettore X^T (MX1). Anche la trasposizione Y è il vettore Y^T(Nx1). Naturalmente la memoria sia X sia X^T sono memorizzati allo stesso modo, in sequenza. Ciò significa che è possibile utilizzare nuovamente GEMV utilizzando matrice trasposta A

?gemv('T', M, N, a, A, M, X, 1, b, Y, 1) 
+0

Grazie per la spiegazione e gli esempi precisi, funziona bene :) –

+0

Ho provato entrambi. Ma '? Gemm' è circa 2 ~ 3 volte più veloce di'? Gemv'. Non dovresti '? Gemv' essere sempre più veloce di'? Gemm'? – mintaka