c++ - 使用 'cvMatMul' 时断言错误

标签 c++ c opencv matrix-multiplication

在我的代码中,在某些时候我必须将 2 个矩阵相乘并将结果放入第三个矩阵。我正在为此使用 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

最佳答案

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

它检查的三件事是: 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!

关于c++ - 使用 'cvMatMul' 时断言错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11858014/

相关文章:

c++ - C 编译器出错,但 C++ 编译器不出错

c - C 中的环境变量

opencv - 凸轮移位闭塞

python - 如何找到两个轮廓之间的距离

c - 处理矩阵的边界单元格

c++ - 模拟本地网络添加新计算机

c++ - 优化此功能(在 C++ 中)

C++ std::getline 错误

c++ - 从哪里获取 matlab 库(libmat 和 libmx)

c++ - Cocos2d-x : Convert from CCTime to SEL_SCEDULE error