C++ 带复数的viennacl
我用图形卡来解线性方程组(AX=B)。此外,代码使用 我的方程组有复数。所以问题是:我能用viennacl解方程组(带复数)吗 上面是一个实数工作代码的示例C++ 带复数的viennacl,c++,math,armadillo,viennacl,C++,Math,Armadillo,Viennacl,我用图形卡来解线性方程组(AX=B)。此外,代码使用 我的方程组有复数。所以问题是:我能用viennacl解方程组(带复数)吗 上面是一个实数工作代码的示例 // System headers #include <iostream> // Armadillo headers (disable BLAS and LAPACK to avoid linking issues) #define ARMA_DONT_USE_BLAS #define ARMA_DONT_USE_LAPACK
// System headers
#include <iostream>
// Armadillo headers (disable BLAS and LAPACK to avoid linking issues)
#define ARMA_DONT_USE_BLAS
#define ARMA_DONT_USE_LAPACK
#include <armadillo>
#include <complex>
#define VIENNACL_WITH_ARMADILLO 1
// ViennaCL headers
#include "viennacl/linalg/cg.hpp"
#include "viennacl/linalg/bicgstab.hpp"
#include "viennacl/linalg/gmres.hpp"
#include "viennacl/io/matrix_market.hpp"
#include "vector-io.hpp"
//using namespace arma;
using namespace viennacl::linalg;
using namespace std;
typedef arma::mat armat;
typedef arma::vec arvec;
typedef complex<double> dcmplx;
int main(void)
{
int N = 500;
armat A(N,N);
A.randu();
arvec B(N);
B.randu();
arvec X(N);
arvec residual(N);
viennacl::matrix<double> vcl_A(N, N);
viennacl::vector<double> vcl_B(N);
viennacl::vector<double> vcl_X(N);
viennacl::vector<double> vcl_result(N);
viennacl::copy(A, vcl_A);
viennacl::copy(B, vcl_B);
viennacl::copy(X, vcl_X);
std::cout << "----- Running GMRES -----" << std::endl;
vcl_X = viennacl::linalg::solve(vcl_A, vcl_B, viennacl::linalg::gmres_tag());
viennacl::copy(vcl_A, A);
viennacl::copy(vcl_B, B);
viennacl::copy(vcl_X, X);
residual = A * X - B;
cout << "Relative residual: " << norm(residual) / norm(B) << endl;
}
//系统头
#包括
//犰狳头(禁用BLAS和LAPACK以避免链接问题)
#定义ARMA\u不使用\u BLAS
#定义ARMA\u不使用\u LAPACK
#包括
#包括
#用犰狳1定义VIENNACL_
//维也纳标题
#包括“viennacl/linalg/cg.hpp”
#包括“viennacl/linalg/Biggstab.hpp”
#包括“viennacl/linalg/gmres.hpp”
#包括“viennacl/io/matrix_market.hpp”
#包括“向量io.hpp”
//使用arma;
使用名称空间viennacl::linalg;
使用名称空间std;
类型定义arma::mat armat;
typedef-arma::vec-arvec;
typedef复合物dcmplx;
内部主(空)
{
int N=500;
armat A(N,N);
A.randu();
arvecb(N);
B.randu();
arvecx(N);
arvec残留量(N);
viennacl::矩阵vcl_A(N,N);
向量vcl_B(N);
向量vcl_X(N);
向量vcl_结果(N);
维也纳:副本(A,vcl_A);
维也纳:副本(B,vcl_B);
维也纳:副本(X,vcl_X);
std::coutViennaCL目前不支持复数。主要的技术原因是OpenCL本身不支持复数。虽然通过实数运算模拟复数运算是可能的,但我们不愿意走这条路,并且(错误地?)希望很快就可以实现复杂的标准化。您是否尝试将其与一起使用?您是否遇到任何特定错误或问题,我们可能可以帮助您解决?您的问题似乎过于宽泛。是的,我有。我包括了上面的示例。我不知道这里是否有人可以帮助我,但我会尝试。;)错误是什么/p你观察到的问题?请逐字逐句地回答你的问题。
#include <iostream>
// Armadillo headers (disable BLAS and LAPACK to avoid linking issues)
#define ARMA_DONT_USE_BLAS
#define ARMA_DONT_USE_LAPACK
#include <armadillo>
#include <complex>
#define VIENNACL_WITH_ARMADILLO 1
// ViennaCL headers
#include "viennacl/linalg/cg.hpp"
#include "viennacl/linalg/bicgstab.hpp"
#include "viennacl/linalg/gmres.hpp"
#include "viennacl/io/matrix_market.hpp"
#include "vector-io.hpp"
//using namespace arma;
using namespace viennacl::linalg;
using namespace std;
typedef arma::cx_mat armat;
typedef arma::cx_vec arvec;
typedef complex<double> dcmplx;
int main(void)
{
int N = 500;
armat A(N,N);
A.randu();
arvec B(N);
B.randu();
arvec X(N);
arvec residual(N);
viennacl::matrix<dcmplx> vcl_A(N, N);
viennacl::vector<dcmplx> vcl_B(N);
viennacl::vector<dcmplx> vcl_X(N);
viennacl::vector<dcmplx> vcl_result(N);
viennacl::copy(A, vcl_A);
viennacl::copy(B, vcl_B);
viennacl::copy(X, vcl_X);
std::cout << "----- Running GMRES -----" << std::endl;
vcl_X = viennacl::linalg::solve(vcl_A, vcl_B, viennacl::linalg::gmres_tag());
viennacl::copy(vcl_A, A);
viennacl::copy(vcl_B, B);
viennacl::copy(vcl_X, X);
residual = A * X - B;
cout << "Relative residual: " << norm(residual) / norm(B) << endl;
std::cout << "----- Running BiCGStab -----" << std::endl;
vcl_X = viennacl::linalg::solve(vcl_A, vcl_B, viennacl::linalg::bicgstab_tag());
viennacl::copy(vcl_A, A);
viennacl::copy(vcl_B, B);
viennacl::copy(vcl_X, X);
residual = A * X - B;
cout << "Relative residual: " << norm(residual) / norm(B) << endl;
std::cout << "----- Running CG -----" << std::endl;
vcl_X = viennacl::linalg::solve(vcl_A, vcl_B, viennacl::linalg::cg_tag());
viennacl::copy(vcl_A, A);
viennacl::copy(vcl_B, B);
viennacl::copy(vcl_X, X);
residual = A * X - B;
cout << "Relative residual: " << norm(residual) / norm(B) << endl;
}