数学建模 | matlab自定义函数 |
---|---|
时间 | 2020年5月10日 |
学习Matlab自定义函数使用,并结合所学函数简单修改了一下上周的代码实现了Topsis法。
程序文件即脚本文件,无function;
函数文件有function,且在第一行或者第一个不是注释的行
1)一个参数:
定义形式:
function y=f(x)
y=x^2;
2)多个参数:
多元函数可以看做向量函数(四种形式实现同一题的运算)
函数定义形式(两个输入两个输出)
function [y1,y2]=f1(x1,x2)
y1=x1+x2;
y2=x1-x2;
end
函数调用形式
[a,b]=f1(2,3)
函数定义形式(将两个输入合成一个向量)
function [y1,y2]=f1(x)
y1=x(1)+x(2);
y2=x(1)-x(2);
end
函数调用形式
[a,b]=f2([2,3])
函数定义形式(将两个输出合成一个向量)
function y=f3(x1,x2)
y(1)=x1+x2;
y(2)=x1-x2;
end
函数调用形式
c=f3(2,3)
函数定义形式(将两个输入合成一个向量,将两个输出合成一个向量)
function y=f4(x)
y(1)=x(1)+x(2);
y(2)=x(1)-x(2);
end
函数调用形式
d=f4([2,3])
3)任意多个参数的情况:
a.参数
varargin任意多个输入参数
varargout任意多个输出参数
nargin得到实际输入参数个数
nargout得到实际输出参数个数
b.对于输入变量,MATLAB可以识别输入变量的个数,通过nargin来记录当前输入变量个数。通过nargin判断变量个数,然后再写对应的程序
c.对于输出变量,MATLAB可以根据调用情况来输出结果,根据调用的格式,自动忽略没匹配上的输出结果。
d.函数做好之后,需要写好说明,否则代码的通用性会很差。matlab自动将函数下的注释当作函数说明,通过help来查看帮助文档
4)写一个函数计算输入参数之和(输入参数可以是任意多个)
function y=ssum(varargin)
n=nargin
y=0;
for i=1:n
y=varargin{i}+y;
end
5)对于一组数据 x1,x2,…,xm, 分高优指标、低优指标、中优指标、均优指标,四种标准化方式对数据标准化。(学习代码并理解nargin的用法)
function [x] = standlize(v,type,q)
%STANDLIZE 对列向量v 进行归一化 返回归一化后的向量 x
% x = STANDLIZE(v,'low') 对列向量按低优指标进行归一化
% x = STANDLIZE(v,'high') 对列向量按高优指标进行归一化
% x = STANDLIZE(v,'middle',q) 对列向量按中优指标进行归一化
% x = STANDLIZE(v,'between',q) 其中 q = [a , b] 对列向量按均优指标进行归一化
m = length(v);
if nargin==2%两个输入参数,一个是向量V,另一个是指标类型
if strcmp(type,'low') %低优指标
%[strcmp](https://ww2.mathworks.cn/help/matlab/ref/strcmp.html)
for i=1:m
x(i) = (max(v)-v(i))/(max(v)-min(v));
end
elseif strcmp(type,'high') %高优指标
for i=1:m
x(i) = (v(i)-min(v))/(max(v)-min(v));
end
end
elseif nargin==3
%输入变量有三个,第一个是向量V、第二个是指标类型、第三个是q;
%若为中优指标,q用于存放中间值;
%若为均优指标(即我们所学的区间型指标),q用于存放均优指标的区间( q = [a , b] )。
%因此可结合q的长度来区分中优指标和均优指标。
if strcmp(type,'middle')&&length(q)==1 %中优指标
for i=1:m
if v(i) < q
x(i) = 1 - (q-v(i))/max([q-min(v),max(v)-q]);
elseif v(i) > q
x(i)=1- (v(i)-q)/max([q-min(v),max(v)-q]);
else
x(i) = 1;
end
end
elseif strcmp(type,'between')&&length(q)==2 %均优指标
for i=1:m
if v(i) < q(1)
x(i) = 1-(q(1)-v(i))/(max([q(1)-min(v),max(v)-q(2)]));
elseif v(i) > q(2)
x(i) = 1-(v(i)-q(2))/(max([q(1)-min(v),max(v)-q(2)]));
else
x(i)=1;
end
end
end
end
x = reshape(x,size(v));
%访问链接查看[reshape](https://blog.csdn.net/weixin_33805557/article/details/94506302)
end
简单了解matlab的绘图函数(条形图)
% clear all;
data=S;%代入数据
b=bar(data,'BarWidth',0.6);%可以直接设置条形图的宽度
grid on;
%grid是显示或隐藏坐标轴网格线,grid on是打开网格,grid off是关闭网格。
set(gca,'XTick',1:25,'XTickLabel',{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y'})%设置横坐标数值
for i = 1:25
text(i,S(i)+0.1,num2str(data(i)),'VerticalAlignment','middle','HorizontalAlignment','center','FontSize',12);%为条形图添加数标
end
set(gca,'FontSize',9);%设置字体大小
xlabel('评价对象/河流');%横坐标标签
ylabel('评分');%纵坐标标签
axis([0 26 0 0.1]);%设置坐标轴显示范围
%axis一般用来设置axes的样式,包括坐标轴范围,可来读比例等,
%这儿用来设置坐标轴的范围,axis([xmin xmax ymin ymax])