gpt4 book ai didi

c++ - 在 OpenCv 中计算 cv::Mat 的外(张量)积

转载 作者:太空狗 更新时间:2023-10-29 19:48:13 28 4
gpt4 key购买 nike

有没有一种方法可以使用 cv::Mat OpenCV 中的数据结构?

我检查过 the documentation并且没有内置功能。但是我在尝试将标准矩阵乘法表达式 (*) 与 cv::Mat 类型的 vector 一起使用时遇到异常。

这是(伪)代码:

cv::Mat tmp = cv::Mat::zeros(9, 1, CV_32SC1)
cv::Mat outerProduct = tmp * tmp.t();

外积计算给出异常。 (是的,我在实际代码中的 tmp 矩阵中有实际值,但此描述提供了有关所使用数据类型的更多信息)

理想情况下,cv::Mat outerProduct 应该以 9x9 矩阵结束。

我可以使用 cv::Mat 的缩放乘法属性来做到这一点(即按其维度重复列 vector tmp,并且对于每一列,缩放元素按索引中的值-- as in how you may solve this kind of multiplication by hand ):

cv::Mat outerProduct = cv::repeat(tmp, 1, 9);
for (int i = 0; i < 9; i++)
{
outerProduct.col(i) *= tmp.at<int>(i, 0);
}

...但如果有更好的方法就好了。

最佳答案

请注意,虽然我的回答是正确的,@kaanoner's answer提供更好的性能。


他们会在您最意想不到的地方偷偷使用这些方法。这个在Operations on Arrays它叫做mulTransposed .

cv::Mat tmp = (Mat_<double>(9,1) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
cv::Mat outerProduct;
mulTransposed(tmp, outerProduct, false);

第三个参数是aTa。如果为真,该方法将计算 aTa。如果为假,则计算 aaT

输出是:

tmp = 
[1; 2; 3; 4; 5; 6; 7; 8; 9]
outerProduct =
[1, 2, 3, 4, 5, 6, 7, 8, 9;
2, 4, 6, 8, 10, 12, 14, 16, 18;
3, 6, 9, 12, 15, 18, 21, 24, 27;
4, 8, 12, 16, 20, 24, 28, 32, 36;
5, 10, 15, 20, 25, 30, 35, 40, 45;
6, 12, 18, 24, 30, 36, 42, 48, 54;
7, 14, 21, 28, 35, 42, 49, 56, 63;
8, 16, 24, 32, 40, 48, 56, 64, 72;
9, 18, 27, 36, 45, 54, 63, 72, 81]

查看源代码,mulTransposed 似乎不支持 CV_32S。以下是它们指定的源和目标类型:

(stype == CV_8U && dtype == CV_32F)
(stype == CV_8U && dtype == CV_64F)
(stype == CV_16U && dtype == CV_32F)
(stype == CV_16U && dtype == CV_64F)
(stype == CV_16S && dtype == CV_32F)
(stype == CV_16S && dtype == CV_64F)
(stype == CV_32F && dtype == CV_32F)
(stype == CV_32F && dtype == CV_64F)
(stype == CV_64F && dtype == CV_64F)

正如这暗示的那样,目标类型始终是 float 类型。即使我指定了 CV_16S 的 dtype,我得到的矩阵也是 CV_32F

关于c++ - 在 OpenCv 中计算 cv::Mat 的外(张量)积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29808896/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com