⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 judgementmatrix.m

📁 网络分析法(ANP)的一个实现
💻 M
字号:
% 读取一个格式化文件中所有矩阵,连接成归一化的判断矩阵
% 计算最大特征值对应的特征向量,进行一致性检验,构造判断矩阵.
% version 2.0

% 矩阵文件的(*.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 函数结束


% 忽略一些特定的行
% IgnoreLine 函数开始

function a = IgnoreLine(fid)

a = fgetl(fid);

% 忽略'|'(竖线),' '(空格)开头的行,以及''(回车)行
while isempty(a) || strcmp(a(1), '|') || strcmp(a(1), ' ')
    a = fgetl(fid);
end

% IgnoreLine 函数结束

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -