【问题标题】:C++ Armadillo Access Triangular Matrix ElementsC++ 犰狳访问三角矩阵元素
【发布时间】:2015-05-12 06:05:40
【问题描述】:

访问犰狳矩阵的上三角或下三角元素的最有效(即平衡内存和速度)方法是什么?我知道我可以为元素提供一个整数向量,但是随着矩阵变得非常大,我想避免携带另一个大向量。或者有没有一种快速创建下/上三角指数的有效方法?

以 5x5 矩阵为例

// C++11 Initialization
arma::mat B = { 1, 2, 3, 4, 5,
                6, 7, 8, 9, 10,
                11, 12, 13, 14, 15,
                16, 17, 18, 19, 20,
                21, 22, 23, 24, 25 };
B.reshape(5,5);


// the matrix
//1    6   11   16   21
//2    7   12   17   22
//3    8   13   18   23
//4    9   14   19   24
//5   10   15   20   25

我想在结果向量所在的下三角形中提取元素:

2 3 4 5 8 9 10 14 15 20

我现在能想到的唯一解决方案是使用uvec 对象。例如:

arma::uvec idx {1,2,3,4,7,8,9,13,14,19);
arma::vec lower_elems = B.elem(idx);

最终对象不必是向量。我只需要能够访问元素进行各种比较。举个简单的例子,假设我想检查它们是否都等于 0。

【问题讨论】:

    标签: c++ matrix armadillo


    【解决方案1】:

    检查下三角形中的所有元素是否都为零:

    bool all_zero = all( X.elem(find(trimatl(X))) == 0 );
    

    【讨论】:

    • 这很接近,但它也包括对角线。有没有办法只看三角形元素?例如,一个 3x3 对角矩阵如果任何对角元素不为零,而对于上三角或下三角本应为真,则该矩阵为假。
    • 据我所知,三角矩阵的定义总是包含对角线。例如,参见 MathWorldWikipedia 中的定义
    • wiki 将上下三角矩阵称为主对角线下方上方的所有元素均为零。在我看来,这并不意味着它们应该包括对角线。
    • 引用Wikipedia 文章:“下三角如果所有条目高于主对角线都是 ”。换句话说,下三角矩阵包含对角线。 Mathworld 中的定义相同,其中明确包括对角线元素。
    • 也许创建一个临时的对角线设置为零:mat Y = X; Y.diag().zeros(); bool all_zero = all( Y.elem(find(trimatl(Y))) == 0 );
    【解决方案2】:

    犰狳 9.900 具有 trimatu_ind()trimatl_ind() 功能。这些函数提供矩阵的上三角部分和下三角部分的索引。这些索引可以与.elem() 一起使用以访问上/下三角形部分中的元素。

    还有函数.is_trimatu().is_trimatl() 可以检查矩阵是上三角还是下三角。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多