gpt4 book ai didi

c++ - 三角和对称矩阵的特征填充存储和优化操作

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:31 26 4
gpt4 key购买 nike

到目前为止,我知道 eigen 没有为三角矩阵或对称矩阵提供任何特殊的优化操作。而且它也不为这些矩阵使用任何打包存储。三角矩阵和对称矩阵都被视为正规矩阵。但是eigen有view的概念.但是在 Eigen 的文档中,他们提到他们对对称矩阵和三角矩阵执行优化操作。而且我也不明白他们的意思 The opposed triangular part is never referenced and can be used to store other information

TriangularView gives a view on a triangular part of a dense matrix and allows to perform optimized operations on it. The opposite triangular part is never referenced and can be used to store other information.

他们对对称矩阵提到了同样的事情

Just as for triangular matrix, you can reference any triangular part of a square matrix to see it as a selfadjoint matrix and perform special and optimized operations. Again the opposite triangular part is never referenced and can be used to store other information.

所以我的问题是:

  1. Eigen 是将对称矩阵和三角矩阵视为特殊矩阵,还是像其他任何 Eigen 矩阵一样将其视为正规矩阵?

  2. Eigen 是打包存储还是特殊压缩存储?

  3. 这条线是什么意思对面的三角形部分永远不会被引用,可以用来存储其他信息?

  4. eigen 是否对三角矩阵和对称矩阵执行任何优化操作?

虽然这里看起来有 4 个问题,但它们都是密切相关的。除了问题 3,我可以回答是/否。

最佳答案

一般我们可以说Eigen主要是针对速度优化的,而不是针对存储空间优化的。

  1. 如您所见, View 概念是对称矩阵和三角矩阵的特殊排列;
  2. 不,使用特殊存储方案为三角矩阵节省 50% 的内存空间似乎对 Eigen 没有太大吸引力;
  3. 在一般密集矩阵方案中存储三角矩阵时,有 50% 的空间未被使用。您可以使用未使用的部分来存储其他东西;
  4. 是的,您可以使用对称/自伴 View 为 A * A^T 等操作节省 50% 的运行时间

此代码以不同的方式计算A * A^T,并针对您的问题进行了演示 3。您可以比较结果并以合理的大维度测量运行时间。

#include <iostream>
#include "Eigen/Eigen"

int main() {
using namespace Eigen;

const int n = 5;
Eigen::MatrixXd a(n, n), b(n, n), c(n, n), d(n, n);
a.setRandom();
b.setZero();
c.setZero();
d.setZero();
d.bottomLeftCorner(n / 2, n / 2).setConstant(100);

std::cout << "original d =\n" << d << std::endl;

b = a * a.transpose();
std::cout << "b=\n" << b << std::endl;

c.selfadjointView<Upper>().rankUpdate(a);
std::cout << "c=\n" << c << std::endl;

d.selfadjointView<Upper>().rankUpdate(a);
std::cout << "d=\n" << d << std::endl;

return 0;
}

输出:

original d =
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
100 100 0 0 0
100 100 0 0 0
b=
2.45959 0.767369 1.13659 -0.511436 1.29631
0.767369 0.557756 0.124955 -0.480089 0.434794
1.13659 0.124955 1.39678 -0.660623 0.87062
-0.511436 -0.480089 -0.660623 1.43841 -0.103395
1.29631 0.434794 0.87062 -0.103395 2.02476
c=
2.45959 0.767369 1.13659 -0.511436 1.29631
0 0.557756 0.124955 -0.480089 0.434794
0 0 1.39678 -0.660623 0.87062
0 0 0 1.43841 -0.103395
0 0 0 0 2.02476
d=
2.45959 0.767369 1.13659 -0.511436 1.29631
0 0.557756 0.124955 -0.480089 0.434794
0 0 1.39678 -0.660623 0.87062
100 100 0 1.43841 -0.103395
100 100 0 0 2.02476

关于c++ - 三角和对称矩阵的特征填充存储和优化操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38420387/

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