Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV:与包含Vec3d的矩阵和包含Double的矩阵相乘_C++_Opencv_Matrix - Fatal编程技术网

C++ OpenCV:与包含Vec3d的矩阵和包含Double的矩阵相乘

C++ OpenCV:与包含Vec3d的矩阵和包含Double的矩阵相乘,c++,opencv,matrix,C++,Opencv,Matrix,我使用OpenCV已经有一段时间了,现在我需要这种类型的乘法: 定义一个矩阵T,其中包含Vec3d1类型的元素。矩阵T的大小为:M X N。矩阵T必须乘以一个向量Phi,该向量的大小为:N X 1,包含两个s作为值。结果的每个元素必须是两个矩阵的矩阵乘法的结果 我不想进行组件式乘法,而是“实”矩阵乘法,例如,将t2的第一个元素与矩阵J的第一个元素相乘,然后将矩阵t3的第二个元素与矩阵J的第二个元素相乘。执行此操作直到完成第一行T,然后汇总结果。结果是mx1 例如,如果T是一个3x2矩阵,而Phi

我使用OpenCV已经有一段时间了,现在我需要这种类型的乘法:

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

我不想进行组件式乘法,而是“实”矩阵乘法,例如,将
t
2的第一个元素与矩阵
J
的第一个元素相乘,然后将矩阵
t
3的第二个元素与矩阵
J
的第二个元素相乘。执行此操作直到完成第一行
T
,然后汇总结果。结果是mx1

例如,如果
T
是一个3x2矩阵,而
Phi
是一个2x1矩阵,那么对于结果的第一个值,计算应该是
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);
}

for(int i=0;i我仍然不知道您希望得到什么样的结果,但可以尝试以下方法:

假设您有一个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;
    }

对于(int i=0;我不想“帮助”编译器,
mMatrixT.at(i,j)
很好(即,如果已经推导出模板参数,则不要显式给出它)你的矩阵T的大小似乎是MxNx3。然后你想用这个T乘以大小为Nx1的向量φ。但是在下一句话中,你说有一个矩阵乘法。但是没有两个矩阵。(除了突然出现的矩阵J)请详细说明。顺便说一句“实”使用
A*B
可以简单地完成包含两个具有拟合维数的二维矩阵的矩阵乘法。谢谢,这似乎减少了很多分配,但仍然没有达到合适的性能。不过这是一个很好的改进:)@MatthäusBrandl你说得对,我混合了矩阵J和Phi。在这种情况下,矩阵J和矩阵Phi都是相同的。我知道两个包含双值的矩阵可以简单地用星形运算符相乘。现在我有一个包含vec3d值的矩阵T和一个包含常规双值的矩阵Phi。现在我想乘以veT中的系数和φ中的标量值,因此每次乘法的结果向量与矩阵T的每一行相加。很抱歉把矩阵弄混了。结果应该是什么?Vec3d的1xn矩阵与double类型的nx1矩阵的矩阵乘法是什么?应该是double_i*Vec3d_i的和吗?我不知道我不认为你可以直接使用矩阵乘法,因为对于单通道矩阵的矩阵乘法,三通道矩阵没有数学上的定义。谢谢。我会尝试一下:)。@ThomasKosch这也是我的猜测,也许你可以重构你的计算来使用数学上(定义良好)的计算。否则,您可能会尝试使用3D矩阵而不是2D向量矩阵。排列矩阵尺寸,以便在进行点积或矩阵积时访问连续内存。@Mika与OP相同:不要帮助编译器,让它尽可能推断模板参数。