Matlab

函数查询网站:https://ww2.mathworks.cn/help/stateflow/matlab-functions.html

常用

%% MATLAB快速入门
% 对于学习MATLAB,大家切忌一股脑的扑在全套教程上,打算全学完MATLAB再来学习数学建模,其实大可不必。
% 我们只需要掌握基本的语法即可,在实际比赛和科研中,即查即用,养成查工具资料和帮助文档的习惯。
% 查询网站:https://ww2.mathworks.cn/help/stateflow/matlab-functions.html
%% Matlab常用操作
% (1)赋值语句
a = 1;
a = 2
% % (2)多行注释,选中语句,快捷键Ctrl+R
% a = 1;
% a = 2
% (3)取消注释:选中语句,快捷键Ctrl+T
% 清除工作区的所有变量
clear
% 清屏
clc
% 这两条一起使用,起到“初始化”的作用
clear;clc % 分号也用于区分行。
%% 输出和输入函数(disp 和 input)
% disp函数
disp('大家好,我是大师兄,欢迎一键三连')
a = [1,2,3] %矩阵的同一行中间用逗号或空格分隔
a = [1 2 3] %空格分隔
disp(a)
%% 判断语句
a = input('请输入考试分数:')
if a >= 85
disp('成绩优秀')
elseif a >= 60
disp('成绩合格')
else
disp('成绩挂科')
end
%% 字符串
% 合并几个字符串
% (1)方法一:strcat(str1,str2……,strn)
strcat('字符串1','字符串2')
% (2)方法二:[str 1,str 2,……, str n]或[str1 str2 …… strn]
['字符串1' '字符串2']
['字符串1','字符串2']
% 转换字符串
c = 100
num2str(c)
disp(['c的取值为' num2str(c)])
disp(strcat('c的取值为', num2str(c)))
%% sum求和函数
% (1)如果是向量(无论是行向量还是列向量),都是直接求和
E = [1,2,3]
sum(E)
E = [1;2;3]
sum(E)
% (2)如果是矩阵,则需要指明是按行还是按列求和
clc
E = [1,2;3,4;5,6]
a = sum(E)
a = sum(E,1)%按列求和(得到一个行向量)
a = sum(E,2)%按行求和(得到一个列向量)
%对整个矩阵求和
a = sum(sum(E))
a = sum(E(:))
%% 矩阵的查询
% (1)取指定行和列的一个元素(输出的是一个值)
A=[1 2 5; 1/2 1 2; 1/5 1/2 1];
A
A(2,1)
A(3,2)
% (2)取指定的某一行的全部元素(返回的是一个行向量)
A(1,:)
A(2,:)
% (3)取指定的某一列的全部元素(返回的是一个列向量)
A(:,1)
A(:,3)
% (4)取指定的某些行的全部元素(返回的是一个矩阵)
A([1,3],:) % 只取第一行和第三行
A(1:3,:) % 取第一行到第三行
A(1:2:3,:) % 取第一行和第三行 (从一开始,每次递增2个行,到3结束)
% 递增语法
1:3:10
10:-1:1
A(1:end,:) % 取第一行到最后一行
A(1:end-1,:) % 取第一行到倒数第二行
% (5)取全部元素(按列拼接的,最终输出的是一个列向量)
A(:)
%% size函数
clc;
A = [1,2,3;4,5,6]
B = [1,2,3,4,5,6]
size(A)
size(B)
% size(A)函数是用来求矩阵A的大小的,它返回一个行向量,第一个元素是矩阵的行数,第二个元素是矩阵的列数
[r,c] = size(A)
% 指定返回行数或列数
r = size(A,1) %返回行数
c = size(A,2) %返回列数
%% repmat函数
% B = repmat(A,m,n):将矩阵A复制m×n块,即把A作为B的元素,B由m×n个A平铺而成。
% 就是先创建一个m×n的矩阵,然后把A作为元素填充进去
A = [1,2,3;4,5,6]
B = repmat(A,2,1)
B = repmat(A,3,2)
%% 矩阵的运算
% MATLAB在矩阵的运算中,“*”号和“/”号代表矩阵之间的乘法与除法(A/B = A*inv(B))
A = [1,2;3,4]
B = [1,0;1,1]
A * B
inv(B) % 求B的逆矩阵
B * inv(B)
A * inv(B)
A / B
% 两个形状相同的矩阵对应元素之间的乘除法需要使用“.*”和“./”
A = [1,2;3,4]
B = [1,0;1,1]
A .* B
A ./ B
% 每个元素同时乘或除相同的倍数
A = [1,2;3,4]
A * 2
A .* 2
A / 2
A ./ 2
% 每个元素同时乘方时只能用 .^
A = [1,2;3,4]
A .^ 2 %将各个元素平方
A ^ 2
A * A
%% 求特征值和特征向量
A = [1 2 3 ;2 2 1;2 0 3]
% 求矩阵A的全部特征值,返回一个由特征值构成的向量
E=eig(A)
% 求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量。(V的每一列都是D中与之相同列的特征值的特征向量)
[V,D]=eig(A)

层次分析

%% 层次分析法
% 只有非一致矩阵才需要一致性检验
% % 要先进行一致性检验,通过后才能求权重,我们这里为了方便讲解才放到了最后做的一致性检验
%% 获取判断矩阵
disp('请输入判断矩阵A')
A=input('A=');
[n,n] = size(A);
%% 方法1: 算术平均法求权重
Sum_A = sum(A); %将A矩阵按列求和
SUM_A = repmat(Sum_A,n,1);
Stand_A = A ./ SUM_A;
disp('算术平均法求权重的结果为:');
w1 = sum(Stand_A,2)./n;
disp(w1)
%% 方法2: 特征值法求权重
[V,D] = eig(A);
Max_eig = max(max(D));% 先按列求最大值,得到行向量,再从这个向量里面求最大值
[r,c]=find(D == Max_eig , 1);
disp('特征值法求权重的结果为:');
w2 = V(:,c) ./ sum(V(:,c));
disp(w2)
disp('两种方法的平均权值为:');
disp((w1 + w2) ./ 2);
%% 计算一致性比例CR
CI = (Max_eig - n) / (n-1);
RI=[0 0.0001 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59]; %这里的RI最多支持 n = 15,注意检查!
% 这里n=2时,RI=0,我们为了避免分母为0,将这里的第二个元素改为了很接近0的正数
CR=CI/RI(n);
disp('最大特征值为:');
disp(Max_eig);
disp('一致性指标CI=');disp(CI);
disp('一致性比例CR=');disp(CR);
if CR<0.10
disp('CR<0.10,该判断矩阵A的一致性可以接受!');
else
disp('注意:CR >= 0.10,该判断矩阵需要进行修改!');
end
%% 注意事项
% 大家看完代码后一定要自己上手复现一遍,版式整洁,写好注释,这样比赛时就可以直接复制到论文里了,国赛对于论文的查重要求非常严格,代码雷同也算作抄袭

熵权法

%clear;clc;
X = xlsread('blind date.xlsx');
%% 正向化
disp('***正在进行正向化...***');
vec = input('请输入要正向化的向量组,请以数组的形式输入,如[1 2 3]表示1,2,3列需要正向化,不需要正向化请输入-1\n') %注意输入函数这里是单引号
if (vec ~= -1)
for i = 1 : size(vec,2)
flag = input(['第' num2str(vec(i)) '列是哪类数据(【1】:极小型 【2】:中间型 【3】:区间型),请输入序号:\n']);
if(flag == 1)%极小型
X(:,vec(i)) = Min2Max(X(:,vec(i)));
elseif (flag == 2) % 注意这里的else和if是连在一起的
best = input('请输入中间型的最好值:\n');
temp = X(:,vec(i));
X(:,vec(i)) = Mid2Max(X(:,vec(i)), best);
elseif (flag == 3)
arr = input('请输入最佳区间,按照“[a,b]”的形式输入:\n');
X(:,vec(i)) = Int2Max(X(:,vec(i)), arr(1), arr(2));
end
end
disp('所有的数据均已完成正向化!')
end
%% 标准化
disp('***正在进行标准化...***');
[n,m] = size(X);
% 先检查有没有负数元素
isNeg = 0;
for i = 1 : n
for j = 1 : m
if(X(i,j) < 0)
isNeg = 1;
break;
end
end
end
if (isNeg == 0)
squere_X = (X.*X);
sum_X = sum(squere_X,1).^0.5; %按列求和,再开方
stand_X = X./repmat(sum_X, n, 1);
else
max_X = max(X,[],1); %按照列找出最大元素
min_X = min(X,[],1); %按照列找出最小元素
stand_X = X - repmat(min_X,n,1) ./ (repmat(max_X,n,1) - repmat(min_X,n,1));
end
disp('标准化完成!')
%% 计算样本概率、信息熵和熵权
disp('***正在用熵权法确定权值...***');
P = stand_X ./ repmat(sum(stand_X),n,1);
% 由于ln(0)没有定义,所以我们需要人为的把概率为0的手动指定为一个接近与0的数
for i = 1 : n
for j = 1 : m
if(P(i,j) == 0)
P(i,j) = 0.00001;%在除的时候如果是0会写inf,此处先处理掉
end
end
end
H_x = sum(-P .* log(P)); %注意在MATLAB中,想要算ln(x)应该输入log(x);想要算lg(x)则应该输入log10(x)
e_j = H_x ./ log(n);
d_j = 1 - e_j;
%进行归一化,获得熵权
disp('熵权完成,权值为:');
w = d_j ./ sum(d_j)
 
posted @ 2023-08-08 13:45  yuooo  阅读(39)  评论(0编辑  收藏  举报