2014-10-05 2 views
1

내가 여기서 무엇을 하든지 DGEMM에서 올바른 결과를 얻지 못하는 것 같습니다. 나는 CBLAS와 놀고있다.DGEMM 이후의 마지막 행의 0 값

다음은 관련 코드입니다.

주요 기능 : 여기

int main() 
{ 
    struct Matrix* foo = new(Matrix, 3, 2, (double[6]){ 4.0, 4.0, 4.0, 4.0, 4.0, 4.0 }); 
    struct Matrix* bar = new(Matrix, 2, 3, (double[6]){ 4.0, 4.0, 4.0, 4.0, 4.0, 4.0 }); 
    struct Matrix* baz = matrix_mul(foo, bar); 
    ... 

는 matrix_mul입니다 : 내가 기대하지만

32.0 32.0 32.0 
32.0 32.0 32.0 
0.0 0.0 0.0 

:

void* matrix_mul(struct Matrix* self, struct Matrix* b) 
{ 
    struct Matrix* c; 

    size_t m = self->m; 
    size_t n = b->n; 

    printf("%u,%u\n", m, n); 

    c = new(Matrix, m, n, NULL); 

    cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m, n, 
       self->m, 1.0, self->data, self->m, b->data, b->m, 0.0, 
       c->data, m); 

    return c; 
} 

내가이 얻을 결과를 인쇄 할 때

32.0 32.0 32.0 
32.0 32.0 32.0 
32.0 32.0 32.0 

dgemm을 잘못 사용하면 어떻게됩니까?

답변

1

CblasRowMajor의 경우 행렬의 두 번째 크기를 lda, ldbldc으로 입력해야합니다. 따라서 귀하의 경우 정확한 호출이 나는 또한 두 행렬의 "일반적인"차원 있어야하는데 6 매개 변수를 변경

cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m, n, 
      self->n, 1.0, self->data, self->n, b->data, b->n, 0.0, 
      c->data, n); 

공지 될 것입니다.

+0

내가 올린 질문을 올렸을 때 틀렸어. 내 질문이 업데이트 될 것입니다. – csnate

관련 문제