不管我在这里做什么,我似乎无法从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);
...
这是矩阵:
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
我对杰姆怎么了?
最佳答案
对于CblasRowMajor
,需要将矩阵的第二维度馈送到lda
、ldb
和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个参数,它应该是两个矩阵的“公共”维度。
关于c - DGEMM之后最后一行的零值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26198868/