C++犰狳访问三角矩阵元素



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

例如,使用 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。

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

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

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

还有函数 .is_trimatu() 和 .is_trimatl() 检查矩阵是否为上/下三元矩阵。

最新更新