【问题标题】:Assertion Error while using 'cvMatMul'使用“cvMatMul”时出现断言错误
【发布时间】:2012-08-08 05:12:30
【问题描述】:

在我的代码中,在某些时候我必须将 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

【问题讨论】:

    标签: c++ c opencv matrix-multiplication


    【解决方案1】:

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

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

    【讨论】:

    • ...感谢有关断言失败错误的详细信息。那是相当丰富的......!但是在代码中,我尝试将mulMatTt 的大小设置为vi->rowsEigenVector->cols,但再次出现断言失败错误。还有关于编码风格的 nitpik……thanx 会记住这一点。 :)
    • 那么矩阵的类型是否可能不兼容?
    • 我刚刚重新检查了矩阵的类型......它们是兼容的。
    【解决方案2】:

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

    【讨论】:

    • 是的...我已经在文档中阅读过,并尝试将mulMatTt 的大小设置为 1x1...但它仍然给出了一个断言失败错误!
    • @cameo 如果你有A*B,那么1)A中的列数必须与B中的行数相同,得到的矩阵有A s 行数和B 的列数。
    • @juanchopanza:我相信你是对的。我真正想做的是将matlab代码移植到C,C++。而在matlab文件中的代码是:y = A*B;其中 A 行 = 1,列 10000。B 行 1,列 = 1 和 y 行 =1,列 10000。我猜 cvMatMul() 与 matlab 中的乘法不一样。
    • @juanchopanza :我猜它把'B'作为一个标量......!另外,我在 GNU Octave 中运行 matlab 代码..!!我已经读到 Octave 和 MATLAB 之间存在一些差异......不确定这是否是一个问题......只是大声思考。! :)
    • @juanchopanza:结果是 '1x10000' 谢谢你的时间......将尝试找出 matlab 代码中到底发生了什么......!! :)
    猜你喜欢
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多