想做c语言的熵权法
结果后面好像不运行了
代码如下
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#define maxResolutionNumber 128 //最大行数
#define maxFactorNumber 128 //最大列个数
double RI[]={0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45,1.49};
//不能使用char* Matrix[maxYSNumber][maxYSNumber],否则只能存放字符串地址。
//使用字符串形式保存,需要计算时可以使用atof转换为了float型
typedef char Matrix[maxFactorNumber][maxFactorNumber][128];//三维数组,分别表示矩阵的行,列坐标,和存放的字符串值。
typedef double NormalizedMatrix[maxFactorNumber][maxFactorNumber];//二维数组,表示行列
typedef double weightVector[128];//这里只定义了一个向量,作为过渡使用,直接存入矩阵。
Matrix mCriterionLayer;//准则层次比较矩阵
NormalizedMatrix mmCriterionLayer;
Matrix factors[maxResolutionNumber];//因素比较矩阵集合,最多存放 maxResolutionNumber 个矩阵
NormalizedMatrix nFactors[maxResolutionNumber];
Matrix result;//准则层次比较矩阵
void readMatrix(char * filePath,Matrix m);
void printMatrix(Matrix m,int n1,int n2);
int is_in(char*s, char c);
void normalizeMatrix(Matrix m,NormalizedMatrix nm,int n1,int n2);
void countWeight(NormalizedMatrix nm,double n1,double n2,weightVector returnValue);
void Result(weightVector v,double n1,double n2,weightVector nv);
//从cvs文件中读取矩阵信息
//读取文件内容到矩阵m
void readMatrix(char * filePath,Matrix m){
FILE *fp = NULL;
//fp=fopen();导入文件
char *line,*record;
char buffer[1024];
int x=0,y=0,n=0;
if ((fp=fopen(filePath,"r")) != NULL){
char delims[] = ",";
wchar_t *result = NULL;
//当没有读取到文件末尾时循环继续
while (line = fgets(buffer, sizeof(buffer), fp)){
line[strlen(line)-1]='\0';//去除\r\n,无法通过查找\r或\n来处理,但确实先执行\r,将光标移动到第一个字符钱,然后往下一行。可能vc2010对回车的解释看做一个字符?
record = strtok(line, ",");
while (record){
//考虑到小数点以及结束符,自己使用128,而不要用sizeof。
memcpy(m[x][y],record,128/*sizeof(record)+3*/);
record = strtok(NULL, ",");
y++;
}
y=0;
x++;
}
fclose(fp);
fp = NULL;
}
}
//打印矩阵
void printMatrix(Matrix m,int n1,int n2){
int i,j;
for(i=0;i<n1;i++){
for(j=0;j<n2;j++){
if(is_in(m[i][j],'*')!=-1)
printf("\t");
else if(atof(m[i][j])>0&&atof(m[i][j])<10)//为了解决精度显示问题
printf("%.3f \t",atof(m[i][j]));
else
printf("%s \t",m[i][j]);
}
puts("");
}
}
int is_in(char*s, char c){
int n=0;
while(*s != '\0'){
if(*s == c){
return n;
}
else{
s++;n++;
}
}
return -1;
}
//矩阵标准化,标准化之后的结果存入新的矩阵。
void normalizeMatrix(Matrix m,NormalizedMatrix nm,int n1,int n2){//n1是行,n2是列
int i,j;
float sum;
for(j=1;j<n2;j++){
sum=0;
for(i=1;i<n1;i++){
sum+=sqrt(pow(atof(m[i][j]),2));//列增加
}
for(i=1;i<n1;i++){
nm[i-1][j-1]=atof(m[i][j])/sum;
}
}
}
void countWeight(NormalizedMatrix nm,double n1,double n2,weightVector returnValue){
int i,j;
float sum;
NormalizedMatrix nnm;
for(j=1;j<n2;j++){
sum=0;
for(i=1;i<n1;i++){
sum +=nm[i][j];
}
for(i=1;i<n1;i++){
nnm[i-1][j-1]=nm[i][j]/sum;
}
}
for(j=1;j<n2;j++){
sum=0;
for(i=1;i<n1;i++){
sum +=(nnm[i][j]*log(nnm[i][j]));
}
returnValue[j]=-sum/log(n1);
}
}
//将向量值写入结果矩阵。
//col为插入result的第几列,n为weightVector的有效长度
void Result(weightVector v,double n1,double n2,weightVector nv){
int i,j;
float sum;
for(i=1;i<n1;i++){
sum=0;
for(j=1;j<n2;j++){
sum +=(1- v[j]);
}
for(j=1;j<n2;j++){
nv[j]=v[j]/sum;
}
}
}
int main(void){
int i,j;
double n1,n2;
char MatrixName[120];
weightVector wv,vv;
int factorNum=5,solutionNum=3;
puts("请输入因素个数:");
scanf("%d",&factorNum);
puts("请输入行个数:");
scanf("%d",&n1);
puts("请输入列个数:");
scanf("%d",&n2);
puts("---------------结果矩阵:----------------");
readMatrix("./最后计算结果.csv",result);//在标红处输入文件相对路径
printMatrix(result,n1,n2);
puts("---------------准则层比较矩阵:----------------");
readMatrix("./准则层次比较矩阵.csv",mCriterionLayer);//在标红处输入文件相对路径
printMatrix(mCriterionLayer,n1,n2);
puts("---------------因素判断矩阵:----------------");
for( i=0;i<factorNum;i++){
printf("请输入矩阵cvs相对路径:");
scanf("%s",MatrixName);
readMatrix( MatrixName ,factors[i]);
printMatrix(factors[0],n1+1,n2+1);
puts("");
}
normalizeMatrix(mCriterionLayer,mmCriterionLayer,n1+1,n2+2);
//printMatrix(mCriterionLayer,6);
//计算准则层权重
countWeight(mmCriterionLayer,n1,n2,wv);
Result(wv,n1,n1,vv);
//计算判断因素的权重
j=1;
while(j<n2){
printf("第%d列的权重为:%f",j,vv[j]);
j++;
}
printf("测试成功!");
return 0;
}
然后大概是这块代码不执行
j=1;
while(j<n2){
printf("第%d列的权重为:%f",j,vv[j]);
j++;
}
printf("测试成功!");
大家可以帮我看看吗
请具体是 ‘后面’ 是在哪里。