DGEMM之后的最后一行中的零值

时间:2014-10-05 01:49:33

标签: c matrix blas

无论我在这里做什么,我似乎无法从DGEMM获得正确的结果。我正在玩CBLAS。

以下是相关代码。

主要功能:

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 个答案:

答案 0 :(得分:1)

对于CblasRowMajor,您需要将矩阵的第二维提供给ldaldbldc。因此,在您的情况下,正确的呼叫将是

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个参数,该参数应该是" common"两个矩阵的维数。