OpenCV:使用包含Vec3d的矩阵和包含双精度的矩阵进行矩阵乘法

时间:2015-10-02 13:25:29

标签: c++ opencv matrix

我正在使用 OpenCV 一段时间,现在我遇到了需要这种类型的乘法的地步:

  

定义矩阵T,其中包含Vec3d 1 类型的元素。矩阵T的大小为:M X N.矩阵T必须乘以向量Phi,其大小为:N X 1,包含double s作为值。结果的每个元素必须是两个矩阵的矩阵乘法的结果。

我不想进行分量乘法,而是进行“实际”矩阵乘法,例如:将T 2 的第一个元素与矩阵J的第一个元素相乘,然后乘以矩阵T的第二个元素 3 使用矩阵J的第二个元素。在完成T的第一行,然后总结结果之前,请执行此操作。结果是M X 1。

例如,如果T为3 X 2矩阵且Phi为2 X 1矩阵,则对于结果的第一个值,计算应为T_11 * phi_11 + T_12 * phi_21。目前我正在使用两个缓慢的for循环:

for (int i = 0; i<M; ++i){
    cv::Mat summedResult = cv::Mat(3, 1, CV_64F, double(0));
    for (uint32 j = 0; j<N; ++j){
        summedResult = summedResult + 
        (cv::Mat(mMatrixT.at<cv::Vec3d>(i, j)) * mMatrixPhi.at<double>(j));
    }
    // The result matrix contains values of type Vec3d again
    mResultMatrix.at<cv::Vec3d>(i) = cv::Vec3d(summedResult);
}

更一般地说:是否有可能在OpenCV中有效地乘以包含Vec3dsdouble s的矩阵?

1。包含双打的三维向量。

2。坐标:1,1

3。坐标:1,2

1 个答案:

答案 0 :(得分:0)

我仍然不知道你期望什么样的结果,但也许可以试试这个:

假设你有一个Vec3d的MxN矩阵和一个double类型的Nx1矩阵,你的结果将是Vec3d类型的Mx1矩阵:

for (int i = 0; i<M; ++i)
    {
        cv::Vec3d summedResult; // here this must be a Vec3d instead of a matrix, if I assume the right result expection
        for (uint32 j = 0; j<N; ++j)
        {
            summedResult = summedResult + (mMatrixT.at<cv::Vec3d>(i, j) * mMatrixPhi.at<double>(j));
        }
        // The result matrix contains values of type Vec3d again
        mResultMatrix.at<cv::Vec3d>(i) = summedResult;
    }

编辑:

很抱歉,没有读到你提供的代码有效,但速度太慢......好吧,我希望没有优化,因为数学上没有定义。您可以做的是将Vec3d垫转换为Mx(3 * N)矩阵并将Nx1垫转换为(3 * N)x1垫(下一个值之前相同值的3倍)并使用OpenCV矩阵产品直。但是由于两个矩阵的尺寸都要大3倍,所以可能不会更快;)

编辑:将是一个不同的结果,因为每个元素将是Vec3d元素的总和...