【问题标题】:Initializing diagonal matrix in opencv, C++在opencv,C ++中初始化对角矩阵
【发布时间】:2015-07-15 13:40:07
【问题描述】:

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

我需要使用稀疏矩阵(如在 MATLAB 中),即由零和一些非零对角线组成的大矩阵。我为此使用Mat 矩阵,因为我希望能够将它们相乘、转置等。

是否存在一些优雅的方式来初始化这样的矩阵,而不是一个又一个地处理它?

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

谢谢!

【问题讨论】:

  • 多个对角线是什么意思?您是否将 同一对角线中的不同数字 存储在向量或其他东西中?您能否编辑添加最终矩阵的外观?
  • 例如,矩阵 3X3 有一个长度为 3 的“一般”对角线,两个长度为 2 的对角线各一个 - 在主对角线的上方和下方,等等。是的,我可能有不同的数字相同的对角线。
  • 好吧,您可以设置不同的“对角线”,使用 Mat::eye 创建“小”子矩阵来生成每个子矩阵,然后将每个对角矩阵与实际大小的零初始化矩阵相加。如果您还需要设置不同的值,则需要手动设置它们。您总是可以将这一切包装在一个函数中。如果您提供包含数据的数据结构(向量或其他)以及您期望的最终结果,那么提供解决方案会容易得多
  • 既然你提到了matlab,你知道在matlab中怎么做吗?如果是这样,请提供一个可以轻松移植到 OpenCV 的示例。
  • opencv 也有一个稀疏矩阵类。但不确定它是否实现了乘法等

标签: c++ opencv matrix


【解决方案1】:

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

如果您的矩阵足够大以至于上述操作很慢,请查看here

【讨论】:

    【解决方案2】:

    我自己解决了::)

    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 A = Mat::eye(3, 3, CV_8UC1)*64; 来获得它。
    • 垫 B = 垫::zeros(3, 3, CV_8UC1);垫 C = B.diag(0); C.at(0) = 64; C.at(1) = 64; C.at(2) = 64;
    • 这真的比只做B.at&lt;unsigned char&gt;(0,0) = 64;等更好吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多