使用'cvMatMul'时断言错误

时间:2012-08-08 05:12:30

标签: c++ c opencv matrix-multiplication

在我的代码中,在某些时刻我必须乘以2个矩阵并将结果取为第3个矩阵。我正在使用cvMatMul()来获取断言失败错误。 执行矩阵乘法的代码部分:

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

这里,vi有1行和10000个col,而Eigen Vector是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

2 个答案:

答案 0 :(得分: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!

答案 1 :(得分:0)

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