资源简介
用C/C++语言实现如下函数:
1. bool lu(double* a, int* pivot, int n);矩阵的LU分解。
假设数组anxn在内存中按行优先次序存放。此函数使用高斯列选主元消去法将其就地进行LU分解。pivot为输出参数,pivot[0,n) 中存放主元的位置排列。
函数成功时返回false,否则返回true。
2. bool guass(double const* lu, int const* p, double* b, int n);求线代数方程组的解
设矩阵Lunxn为某个矩阵anxn的LU分解,在内存中按行优先次序存放。p[0,n)为LU分解的主元排列。b为方程组Ax=b的右端向量。此函数计算方程组Ax=b的解,并将结果存放在数组b[0,n)中。
函数成功时返回false,否则返回true。
3. void qr(double* a, double* d, int n);矩阵的QR分解
假设数组anxn在内存中按行优先次序存放。此函数使用HouseHolder变换将其就地进行QR分解。
d为输出参数,d [0,n) 中存放QR分解的上三角对角线元素。
4. bool householder(double const*qr, double const*d, double*b, int n); 求线代数方程组的解
设矩阵qrnxn为某个矩阵anxn的QR分解,在内存中按行优先次序存放。d [0,n) 为QR分解的上三角对角线元素。b为方程组Ax=b的右端向量。
函数计算方程组Ax=b的解,并将结果存放在数组b[0,n)中。
函数成功时返回false,否则返回true。
代码片段和文件信息
#include “stdafx.h“
bool lu(double* a int* pivot int n)
{
for(int i=0;i int pivotIndex=(n+1)*i;//当前主元位置
int maxCol=i;//当前主元所在行
for(int j=0;j int indexAdd=(j+1)*n;
if(fabs(*(a+maxCol*n+i)) maxCol=i+j+1;
}//选取列主元
}
if(*(a+pivotIndex)==0){
break;
return true;
}//主元为0,行列式为0,不可分解
if(maxCol!=i){
for(int k=0;k double doubleTemp;
doubleTemp=*(a+i*n+k);
*(a+i*n+k)=*(a+maxCol*n+k);
*(a+maxCol*n+k)=doubleTemp;
}//两行互换
//更新主元向量
int intTemp=*(pivot+i);
*(pivot+i)=*(pivot+maxCol);
*(pivot+maxCol)=intTemp;
}
//消去
for(int j=0;j double multiple=*(a+pivotIndex+n*j+n)/(*(a+pivotIndex));
*(a+pivotIndex+n*j+n)=multiple;
for(int k=1;k *(a+pivotIndex+n*j+n+k)-=(*(a+pivotIndex+k))*multiple;
}
}
}
return false;
}
void convert_b_lu(double const* ludouble* bint const* pivotint n){
//变换右端向量,根据消元过程刷新右端向量
for(int i=0;i for(int j=0;j *(b+(*(pivot+i+j+1)))-=(*(b+(*(pivot+i))))*(*(lu+(n+1)*i+n*(j+1)));
}
}
//根据主元选择过程变换右端向量元素位置
double* temp=new double[n];
for(int i=0;i *(temp+i)=*(b+i);
}
for(int i=0;i *(b+i)=*(temp+(*(pivot+i)));
}
delete[] temp;
}
bool guass(double const* lu int const* p double* b int n)
{
convert_b_lu(lubpn);
*(b+n-1)=(*(b+n-1))/(*(lu+n*n-1));
//迭代
for(int i=5;i>0;i--){
for(int j=0;j *(b+i-1)=(*(b+i-1))-(*(b+n-j-1))*(*(lu+(n+1)*(i-1)+j+1));
}
*(b+i-1)=(*(b+i-1))/(*(lu+(n+1)*(i-1)));
}
return false;
}
void qr(double* a double* d int n)
{
double temp1temp2;
double* temp=new double[n];
for(int i=0;i {
temp1=0;
for(int j=i;j temp1+=(*(a+j*n+i))*(*(a+j*n+i));
if(*(a+n*i+i)>0)
temp1=-sqrt(temp1);
else
temp1=sqrt(temp1);
*(d+i)=temp1;//存储主元
*(a+i*n+i)-=temp1;
temp2=0;
for(int j=i; j<=n-1; j++)
temp2+=(*(a+n*j+i))*(*(a+n*j+i));
temp2= sqrt(temp2);
for(int j=i; j<=n-1; j++)
*(a+n*j+i)=(*(a+n*j+i))/temp2 ;
for(int j=i+1;j {
for(int k=i; k {
temp2=0 ;
for(int l=i; l temp2+=(*(a+n*k+i))*(*(a+n*l+i))*(*(a+n*l+j));
*(temp+k)=(*(a+k*n+j))-2*temp2;
}
for(int k=i; k *(a+k*n+j)=*(temp+k);
}
}
*(d+n-1)=*(a+n*n-1);
delete[] temp;
}
bool householder(double const*qr double const*d double*b int n)
{
double doubleTemp;
double* temp=new double[n];
for(int i=0; i {
for(int j=i; j {
doubleTemp=0;
for(int k=i;k doubleTemp+=(*(qr+n*k+i))*(*(qr+n*j+i))*(*(b+k));
*(temp+j)=*(b+j)-2*doubleTemp;
}
for(int j=i; j *(b+j)=*(temp+
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 75776 2013-04-18 17:37 Task\Debug\Task.exe
文件 424560 2013-04-18 17:37 Task\Debug\Task.ilk
文件 1256448 2013-04-18 17:37 Task\Debug\Task.pdb
文件 36372480 2013-04-13 18:57 Task\ipch\task-2269b20e\task-efa8f59f.ipch
文件 36438016 2013-04-18 17:35 Task\ipch\task-6e8e7c8e\task-efa8f59f.ipch
文件 4006 2013-04-18 17:37 Task\Task\Debug\cl.command.1.tlog
文件 19726 2013-04-18 17:37 Task\Task\Debug\CL.read.1.tlog
文件 1318 2013-04-18 17:37 Task\Task\Debug\CL.write.1.tlog
文件 113893 2013-04-18 17:37 Task\Task\Debug\functions.obj
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
文件 2 2013-04-18 17:37 Task\Task\Debug\li
............此处省略81个文件信息
相关资源
- C++ 验证码识别--源码
- vs c++写的贪吃蛇
- The C++ Standard Library中文版
- VC++《精通GDI+编程》PDF电子书
- C++结合Qt库编写的背单词软件源代码
- Numerical.Recipes.C++数值算法 第二版中文
- c++串口读写源代码
- c++写的泡泡堂的小游戏,可以单机或
- 经典c++代码大全
- MFC PDF教程全套
- C++编写基于TCP/IP的Modbus网络通讯工具
- 精通Visual C++数字图像处理技术与工程
- 21天学通C++第四版中文版
- C++设计新思维简体中文版清晰
- GPS伪距差分程序C++
- VC++6.0从入门到精通
- mfc编程共85个
- C#封装C++DLL并调用
- 数据结构C++版第二版--王红梅所有课件
- 正运动控制器入门程序例程vc++6.0版
- Exceptional C++中文版 绝对清晰带目录
- MFC销售管理SaleSystem.rar
- c++车牌识别
- VS2017C++windows桌面应用程序项目OpenCV及
- C++ 画直线、三角形、矩形、直线
- c++程序设计-刘振安书籍含PPT
- 数据结构(C++语言版) 第三版完整版
- C++ Primer Plus中文版第六版
- vscode c/c++扩展(cpptools v0.22.1)离线安
- c++ word\\excel\\ppt转pdf .rar
评论
共有 条评论