1

在我的代码中,在某些时候我必须将 2 个矩阵相乘并将结果放入第 3 个矩阵中。我正在cvMatMul()为此使用并收到断言失败错误。执行矩阵乘法的代码部分:

CvMat* mulMatTt = cvCreateMat(EigenVector->rows,vi->cols,CV_32FC1);
cvMatMul(vi,EigenVector,mulMatTt);

这里,vi 有 1 行和 10000 列,特征向量是一个 1x1 方阵。我相信错误是在分配矩阵的大小时mulMatTt。有人可以建议我如何让这个工作吗?

错误:

OpenCV Error: Assertion failed ((D.rows == ((flags & CV_GEMM_A_T) == 0 ? A.rows : A.cols)) && (D.cols == ((flags & CV_GEMM_B_T) == 0 ? B.cols : B.rows)) && D.type() == A.type()) in cvGEMM, file C:\opencv\modules\core\src\matmul.cpp, line 29 30
4

2 回答 2

3

嗯,这是一个非常可怕的阅读断言。它检查三件事(都在一个断言中,所以我们不知道哪个是错误的)。所以给图书馆作者一些减分。

它检查的三件事是:1)结果矩阵的行数等于第一个矩阵的行数(除非您要求在乘法之前对第一个矩阵进行转置,在这种情况下,它会检查是否行相当于列)。2)结果矩阵的列数等于第二个矩阵的列数(同样,除非它如上所述被转置)。3)您的结果矩阵的类型与您的第一个矩阵的类型相同。

基本上,这是检查矩阵 D = AB 的格式是否正确。我假设还有另一个检查可以确保 A 和 B 兼容以相乘(A.cols == B.rows(除非转置)&& A.type ==B.type)。

所以我们没有正确地制作我们的结果矩阵。我认为这条线:

CvMat* mulMatTt = cvCreateMat(EigenVector->rows,vi->cols,CV_32FC);

应该:

CvMat* mulMatTt = cvCreateMat(vi->rows, EigenVector->cols,CV_32FC);

我假设类型是正确的。此外,只是编码风格的一个小问题,指针取消引用应该属于变量而不是类型:

CvMat *mulMatTt;

否则你可能会落入这个陷阱:

CvMat* mulMatTt, identity_matrix;

看起来 identity_matrix 是 CvMat* 类型,但实际上是 CvMat!

于 2012-08-08T05:48:28.700 回答
0

在我的书中,如果您将 1x10000 矩阵乘以 1x1 矩阵,则结果是 1x1 矩阵而不是另一个 1x10000 矩阵。所以我认为断言是在抱怨mulMatTt乘法的大小错误。我可能完全错了。

于 2012-08-08T05:36:27.623 回答