我正在使用 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中有效地乘以包含Vec3ds
和double
s的矩阵?
1。包含双打的三维向量。
2。坐标:1,1
3。坐标:1,2
答案 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元素的总和...