2016-10-09 7 views
0

Я совершенно новой для BLAS (с использованием OpenBLAS с C++ и VisualStudio)Использование меньших матриц с BLAS

Я знаю DGEMM выполняет C < - альфа * ор (А) * ор (B) + бета * C

Я пытался сэкономить распределение делает это: B < - 1 * ор (А) * ор (B) + 0 * B

другими словами, помещая результат в матрице B ,

НО делает беты = 0 и повторение B в положении С, приводит к нулевому ответу.

Есть ли способ исправить это?

Код, который я использую:

double* A = new double [3*3]; //3 rows x 3 columns 

A[0] = 8; 
A[1] = 3; 
A[2] = 4; 
A[3] = 1; 
A[4] = 5; 
A[5] = 9; 
A[6] = 6; 
A[7] = 7; 
A[8] = 2; 

double* v = new double[3]; //3 rows x 1 column 

v[0] = 3; 
v[1] = 5; 
v[2] = 2; 

double* foo = new double[3]; //3 rows x 1 column 

cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, 
    3, 1, 3, 
    1, 
    A, 3, 
    v, 3, 
    0, 
    foo, 3); // makes foo = [41 ; 48 ; 61], **right** 

cblas_dgemm(CblasColMajor, CblasTrans, CblasTrans, 
    3, 1, 3, 
    1, 
    A, 3, 
    v, 3, 
    0, 
    v, 3); // makes v = [0 ; 0 ; 0], **wrong** 

ответ

0

BLAS dgemm function documentation утверждает, что только параметр С матрицей для ввода и вывода, перезапись результата операции. Поскольку B определен только для ввода, реализация BLAS может предполагать, что его не следует изменять.

Настройка B и C на один и тот же указатель данных может приводить к некоторой проверке ошибок в реализации, которую вы используете, возвращая нулевой результат, чтобы указать это.

+0

Да. Наверное, это что-то вроде этого. Но в документации это не сказано. Нехорошо.... –