gpt4 book ai didi

c++ - Ax=B 使用 boost 1_58 求解稀疏矩阵

转载 作者:行者123 更新时间:2023-11-30 05:42:49 25 4
gpt4 key购买 nike

我正在尝试研究 boost。我只想看看如何求解稀疏矩阵的 Ax=B 线性方程的示例。我看到了使用 umfpack 的示例,但在 boost 1_58 版本中没有 umfpack,我稍微修改了该示例并尝试构建应用程序。在开始示例之前,我还安装了 boost。这是代码:

#include <iostream>
#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <boost/numeric/ublas/vector_sparse.hpp>
//#include <boost/numeric/ublas/traits/ublas_sparse.hpp>
//#include <boost/numeric/bindings/umfpack/umfpack.hpp>
#include <boost/numeric/ublas/io.hpp>

namespace ublas = boost::numeric::ublas;
//namespace umf = boost::numeric::bindings::umfpack;

int main() {

ublas::compressed_matrix<double, ublas::column_major, 0,
ublas::unbounded_array<int>, ublas::unbounded_array<double> > A(5, 5, 12);
ublas::vector<double> B(5), X(5);

A(0, 0) = 2.; A(0, 1) = 3;
A(1, 0) = 3.; A(1, 2) = 4.; A(1, 4) = 6;
A(2, 1) = -1.; A(2, 2) = -3.; A(2, 3) = 2.;
A(3, 2) = 1.;
A(4, 1) = 4.; A(4, 2) = 2.; A(4, 4) = 1.;

B(0) = 8.; B(1) = 45.; B(2) = -3.; B(3) = 3.; B(4) = 19.;

/*
umf::symbolic_type<double> Symbolic;
umf::numeric_type<double> Numeric;

umf::symbolic(A, Symbolic);
umf::numeric(A, Symbolic, Numeric);
umf::solve(A, X, B, Numeric);
*/

std::cout << X << std::endl; // output: [5](1,2,3,4,5)
}

任何人都可以帮助我并展示如何使用新的 boost 求解稀疏矩阵的简单线性方程吗?

最佳答案

您可以通过 boost 获得解决方案,但效率不高。 UMFPACK 扩展是众所周知的。使用它(你仍然使用 boost,所以你的要求是匹配的)。

为了 的利益这是仅限 Boost 的解决方案:¹

Live On Coliru

#include <iostream>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <boost/numeric/ublas/vector_sparse.hpp>
#include <boost/numeric/ublas/lu.hpp>
#include <boost/numeric/ublas/io.hpp>

namespace ublas = boost::numeric::ublas;

int main()
{
ublas::compressed_matrix<double, ublas::column_major, 0> Matrix A(5, 5, 12);

A(0, 0) = 2.; A(0, 1) = 3.;
A(1, 0) = 3.; A(1, 2) = 4.; A(1, 4) = 6.;
A(2, 1) = -1.; A(2, 2) = -3.; A(2, 3) = 2.;
A(3, 2) = 1.;
A(4, 1) = 4.; A(4, 2) = 2.; A(4, 4) = 1.;

ublas::vector<double> y(5);
y(0) = 8.;
y(1) = 45.;
y(2) = -3.;
y(3) = 3.;
y(4) = 19.;

ublas::permutation_matrix<size_t> pm(A.size1());
lu_factorize(A, pm);
lu_substitute(A, pm, y);

std::cout << y << std::endl; // output: [5](1,2,3,4,5)
}

打印:

[5](1,2,3,4,5)

¹ 学分:Boost's Linear Algebra Solution for y=Ax

关于c++ - Ax=B 使用 boost 1_58 求解稀疏矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30506073/

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