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 时,判断矩阵永远具有完全一致性。
if Dimension >= 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 函数结束
能给个样板不?我实在不知道在文档里输入哪些数据怎么输,谢谢!