ValVect.h
#include <iostream>
class ValVect {
public :
ValVect(void);
void clear(void);
//~ValVect(void);
public :
void rdOrMatrix(int _dim, double _e); //从文件中读取对称方阵,将其存在矩valAry中(每一列为一样本向量,即行数为维数)._dim为方阵的阶,_e为计算精度
void itVtAry(void); //初始化样本向量矩阵vectAry(每一列为一特征向量)
void calValVect(void); //计算特征值和特征向量,特征值为valAry个对角线元素,对应的特征向量为vectAry各列
void stValVect(void); //按特征值由大到小将特征值和相应的特征向量排序
void showValVect(void); //输出特征值和相应的特征向量
void sortVect(void); //输出排序后的特征向量矩阵
private :
int dim_; //方阵的阶数
double **valAry, **vectAry; //初始方阵和特征向量方阵
double e_;
};
ValVectFile.h
#include "ValVect.h"
#include <math.h>
#include <malloc.h>
#include <iostream>
ValVect::ValVect() {
dim_ = 0; e_ = 0;
valAry = NULL; vectAry = NULL;
}
void ValVect::rdOrMatrix(int _dim, double _e) { //读取待计算的方阵
dim_ = _dim; e_ = _e;
valAry = (double **)malloc(dim_*sizeof(double));
for(int i=0; i<dim_; i++)
*(valAry+i) = (double *)malloc(dim_*sizeof(double)); //valAry为初始方阵,阶为dim_,每一列为一个样本向量,列数为样本个数,以后在矩阵本身计算特征值
std::cout << "read the original vectors" << '\n';
FILE *fp;
char ch;
if((fp=fopen("ValVectOrMatrix.txt","rt"))==NULL) { //ValVectOrMatrix文件中每一行为一个样本向量,列数代表维数
printf("Cannot open file strike any key exit!");
exit(0);
}
ch=fgetc(fp);
std::string str=""; //这里str是类string的一个对象
int k=0;
while(ch!=EOF) {
for(int i=0; i<dim_; i++) {
while(ch==' ' || ch=='v' || ch=='\n')
ch=fgetc(fp);
while(ch!=' ' && ch!='\n' && ch!='v') {
str+=ch;
ch=fgetc(fp);
}
double aa=atof(str.c_str()); //将字符串转换成double型
*(*(valAry+i)+k) &