300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > anp的matlab程序实现 在matlab上实现ANP 如何输入矩阵的M文件

anp的matlab程序实现 在matlab上实现ANP 如何输入矩阵的M文件

时间:2021-05-08 03:15:32

相关推荐

anp的matlab程序实现 在matlab上实现ANP 如何输入矩阵的M文件

disp('————从文件 AA.txt 中构造判断矩阵————');

[fid_AA, message] = fopen('AA.txt','r');

if fid_AA == -1

error('!文件打开失败!');

end

[Waa,flag] = JudgementMatrix(fid_AA);

if flag == -1

warning('文件中的比较矩阵有问题,!!!构造失败!!!');

else

disp('!!!构造成功!!!');

end

fclose(fid_AA);

这里的AA文件怎么输入数据啊?

矩阵文件的(*.txt)格式要求(共4条)

% 1 空格开头的行,回车行,注释行(见第3条)在读取时都会被忽略.

%

% 2 每个矩阵要有维数(Dimension)和序号(Sequence),其次序可以颠倒,但是不能缺项,

% 且关键字及其取值要各占一行(共4行,中间可以有空格行或空行),但关键字行尾不能有空格.

%

% 3 竖线"|"是注释标记,要独自占一行,但是不要在有效的矩阵元素行之后加竖线.

%

% 4 矩阵的元素只能用空格分开,每个元素后都可以跟空格,且空格的数量可以是任意多个.

% 但是,需要强调的是,每一行第一个元素的前面不能有空格(参照第1条)!

% JudgementMatrix 函数开始

function [judge_matrix_unitize,flag] = JudgementMatrix(fid)

judge_matrix = 0;

judge_matrix_unitize = 0;

flag = 0; % 判断矩阵构造成功的标志

LineData = IgnoreLine(fid);% 跳到第一行有效的数据

Count = 0; % 矩阵计数器

Flag1 = 0; % 是否读取矩阵序号的开关

Flag2 = 0; % 是否读取矩阵列数的开关

Flag3 = 0; % 是否读取矩阵行数的开关

Sequence = 0; % 矩阵的序号

Dimension = 0; % 矩阵的阶

DCount = 0; % 同一文件中每个矩阵的阶数下标

LastCount = 0; % 同一文件中上一个矩阵的阶数下标

while( feof(fid) == 0 )

if strcmp(LineData, 'Sequence')

LineData = IgnoreLine(fid);

if LineData == -1

warning('已经到了文件末尾,无数据可读取!');

flag = -1;

return;

end

Sequence = str2num(LineData);

Flag1 = Flag1 + 1;

elseif strcmp(LineData, 'Dimension')

LineData = IgnoreLine(fid);

if LineData == -1

warning('已经到了文件末尾,无数据可读取!');

flag = -1;

return;

end

DCount = DCount + 1;

Dimension(DCount) = str2num(LineData);

LastCount = DCount-1;

if LastCount > 0 && Dimension(DCount) ~= Dimension(LastCount)

flag = -1;

warning('矩阵的维数不等,比较矩阵弄错了吧!');

end

Flag2 = Flag2 + 1;

end

if ( Flag1 > 1 || Flag2 > 1 )

if Flag1 > 1

c = num2str(Sequence);

c = strcat('第',c);

message = strcat(c, '个矩阵的上一个矩阵没有设置维数关键字"Dimension"!');

flag = -1;

warning(message);

return;

elseif Flag2 > 1

c = num2str(Sequence);

c = strcat('第',c);

message = strcat(c, '个矩阵的上一个矩阵没有设置序号关键字"Sequence"!');

warning(message);

flag = -1;

return;

end

elseif ( Flag1 == 0 && Flag2 ==0 )

warning('没有发现矩阵的序号或行数或列数关键字!请参考文件格式要求!');

flag = -1;

return;

elseif ( Flag1 == 1 && Flag2 == 1 )

Matrix = 0;

% 为了读分数矩阵,逐行读取再变为数值类型

for i = 1:1:Dimension(DCount)

LineData = IgnoreLine(fid);

if LineData == -1

warning('已经到了文件末尾,无数据可读取!');

flag = -1;

judge_matrix_unitize = Unitize(Matrix);

return;

end

DoubleLine = str2num(LineData);

[line_DoubleLine,colume_DoubleLine] = size(DoubleLine);

if colume_DoubleLine ~= Dimension(DCount)

flag = -1;

end

for j = 1:1:colume_DoubleLine

Matrix(i,j) = DoubleLine(j);

end

end

if flag == -1

judge_matrix_unitize = Unitize(Matrix);

return;

end

if isreal(Matrix)

Count = Count + 1;

if Sequence ~= Count

c = num2str(Sequence);

c = strcat('文件中编号为',c);

message = strcat(c,'的矩阵的序号没有按照顺序排列!');

warning(message);

end

% 最大特征值及其对应的特征向量

[vector_lmd_max,lmd_max(Count)] = MaxEV(Matrix);

for j = 1:1:Dimension(DCount)

judge_matrix(Count,j) = vector_lmd_max(j);

end

% 一致性检验

CI(Count) = 0; % 一致性指标

% 当矩阵的阶数 n < 3 时,判断矩阵永远具有完全一致性。

ifDimension >= 3

% 一致性指标

CI(Count) = ( lmd_max(Count) - Dimension(DCount) ) / ( Dimension(DCount) - 1 );

if CI(Count) >= 0.1

c = num2str(Sequence);

c = strcat('第',c);

message = strcat(c,'个矩阵的一致性指标CI不满足条件,建议调整该矩阵元素!');

warning(message);

flag = -1;

break;

end

end

else

c = num2str(Sequence);

c = strcat('第',c);

message = strcat(c, '个矩阵不是实矩阵吧?');

flag = -1;

warning(message);

return;

end

Matrix = 0; % 矩阵清零

Flag1 = 0; % 是否读取矩阵的开关复位

Flag2 = 0; % 是否读取矩阵的开关复位

end

LineData = IgnoreLine(fid);

end

if flag == -1 || Dimension(DCount) ~= Count

flag = -1;

disp('未进行归一化的特征向量');

judge_matrix = judge_matrix'

% 特征向量归一化

disp('归一化的特征向量');

judge_matrix_unitize = Unitize(judge_matrix)

else

flag = 1;

judge_matrix = judge_matrix';

% 判断矩阵归一化

disp('归一化后的特征向量构成的判断矩阵');

judge_matrix_unitize = Unitize(judge_matrix)

end

% JudgementMatrix 函数结束

能给个样板不?我实在不知道在文档里输入哪些数据怎么输,谢谢!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。