2014-10-05 48 views
1

無論我在這裏做什麼,我似乎都無法從DGEMM中獲得正確的結果。我正在玩CBLAS。DGEMM後最後一行的零值

這裏是相關的代碼。

主要功能:

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:

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

雖然我預計:

32.0 32.0 32.0 
32.0 32.0 32.0 
32.0 32.0 32.0 

我在做什麼錯誤的dgemm?

回答

1

對於CblasRowMajor,需要將矩陣的第二維度饋送到ldaldb,並ldc。所以你的情況正確的通話將

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

請注意,我也改變了第6個參數,這應該是兩個矩陣的「共同」的尺寸。

+0

你是對的,當我發佈我有錯的問題。將更新我的問題。 – csnate 2014-10-05 21:32:39