在opencv,C++中初始化对角矩阵

Initializing diagonal matrix in opencv, C++

本文关键字:初始化 opencv C++      更新时间:2023-10-16

我正在使用opencv在C++中编写平滑样条曲线。

我需要使用稀疏矩阵(就像在MATLAB中一样(,即由零和几个非零对角线组成的大矩阵。为此,我使用Mat矩阵,因为我希望能够对它们进行乘法、转置等。

是否存在一些优雅的方法来初始化这样的矩阵,而不需要逐个处理它?

有一个名为Mat::diag的函数,但它创建了一个列矩阵,这不是我所需要的。是否可以将其转换为normal矩阵?与我需要的最相似的是Mat::eye,但我需要初始化多个对角线,此外,我在同一对角线上有不同的数字,所以我不能使用Mat::eye

谢谢!

我自己解决了:(

Mat B = Mat::zeros(3, 3, CV_8UC1);
Mat C = B.diag(0);
C.at<unsigned char>(0) = 64;
C.at<unsigned char>(1) = 64;
C.at<unsigned char>(2) = 64;

Mat::diag是动态的,因此它是有效的。

您可以使用Mat::eye进行初始化,然后乘以包含所需对角线值的1乘N维矩阵。(或者只需手动设置。(如果矩阵足够大,这些操作需要大量时间,则应而不是使用未针对稀疏矩阵优化的Mat

如果你的矩阵足够大,以至于上面的运算很慢,那么看看这里。