生成数组的一些方式
(1)linspace函数
clear; clc; x = linspace(1,4,10); plot(x); %linspace用于产生从1,4的10个等差数组成的向量
(2)双冒号表达式
x = num1: num2: num3; %表示以num2为步长,生成由[num1,num3]范围内的数组成的*数组*,必有num1,但可以没有num3 %而函数作用该数组的结果也是数组,同长度
(3)ones函数
mat = ones(lines,rows);%生成元素全为1的lines行,rows列的矩阵
二维连续函数图像
(1)plot函数
clear; clc; x = [1.2,3,4]; plot(x); %plot函数单纯用来画直线,是两个点两个点地作图 %plot(参数),按对传参,一对xy向量就作一个图,可以无限增加作图量 %可以用于复函数的画图(即加上i)
绘制多元线型,可以传参在x,y的后面,具体见博客【Matlab】MATLAB绘图_GQ-CSDN博客_用matlab画图
(2)fplot函数
先提一嘴函数句柄
命名格式:
f = @已命名函数
或者f = @(argument_list) exp
clear; clc; f = @(x) (x*x); fplot(f,[2,10]); %绘制函数图像,fplot(函数名,自变量区间,设置的线型参数) %也可绘制双函数图像fplot(x轴函数,y轴函数,共同的参数的取值) fplot(@(x)2*sin(x), @(y)2*cos(y),[0,2*pi]); %目前所有表达只能只用单值函数,不管上面的两个函数定义时是否用了同一个变量(x和y表达不同),它都是默认的一个参数(在用的时候x,y是被传的同样一个值)
二维离散函数图像
scatter函数
% scatter(x, y, 选项, 'filled'),数据点的坐标向量(数组),选项用于设置点的颜色,形状等,filled传入才为实心 t = 0:0.001:pi x = 2+cos(t); y = sin(t); scatter(x,y);
多图绘制
(1)将多个图画在一个figure里面(比如有两种散点数据,想画在一个显示窗口里面,则可以在前一组的scatter后接上
hold on
,效果如下clc; data = [2.0, 3.0 , 3; 2.0, 4.0 ,1 ; 1.0, 3.0 ,1 ; 3.0, 3.0,3 ; 17.0, 8.0,1 ; 18.0, 9.0,2 ; 19.0, 7.0,2 ;18.0, 8.0,2 ; 8.0, 8.0 ,1 ;9.0, 7.0, 3; 8.0, 9.0 ,1 ;7.0, 9.0,2]; f = @(x)(x*50); col = arrayfun(f,data(:,3)); scatter(data(:,1),data(:,2),[],col,'filled'); hold on; scatter(1:1:2,4:4:8);
(2)想先后绘制不同的图,且不想被覆盖,则用
%画第一幅图close;figure;%画第二幅图..close用于关闭绘图窗口,figure用于创建新的绘图窗口
前面几个是因为没系统学过m语言才积累的几个基础知识
(1)随机k个初始中心---随机数的生成
查了好多复杂文章,不过其实也就一个rand()函数的返回值足矣
(2)二维数组的创建与访问
arr = [num1,num2,num3 ; num4,num5,num6 ... ]; %和C有区别!不同的行由分号隔开 a1 = arr(1,1); %下标从1开始,也不像C从0开始 rows = arr(:,1); %获得矩阵的第一列,行则反之
(3)求解数组的最值
直接
min(arr)
即得最值,或者[min_value, index] = min(arr)
这个还能得到索引(4)if语句
if condition abb.. else if abb... else abb.. end
(5)数组的映射---arrayfun
res_arr = arrayfun(fun_name,arr);
顾名思义,就是把数组的各个元素按照映射关系(里面的fun)作用于arr的每一个元素,比如:
res_arr = arrayfun(sin,arr); %将arr的每个元素求sin
(6)更多的绘图相关内容自己放到了上面绘图部分,下面上代码
data自己定义,格式是一个矩阵,每一行的3个元素,分别为x,y坐标、分类(初始设为0)
clear; clc; %聚类 K-means的应用 data = [2.0, 3.0 , 0; 2.0, 4.0 ,0 ; 1.0, 3.0 ,0 ; 3.0, 3.0,0 ; 17.0, 8.0,0 ; 18.0, 9.0,0 ; 19.0, 7.0,0 ;18.0, 8.0,0 ; 8.0, 8.0 ,0 ;9.0, 7.0, 0; 8.0, 9.0 ,0 ;7.0, 9.0,0]; k = 3; time = 0; times = 50; %用于绘图时拉开不同颜色差距的倍数 %生成2k个点 center = ones(k,2); %初始化中心 for i = 1:k % center(i,1) = 10 * rand(); % center(i,2) = 10 * rand(); center(i,1) = data(i+7,1); center(i,2) = data(i+7,2); end while 1 time = time+1; %寻找现在的点的分类 for i = 1:12 sum = ones(k,1); for j = 1:k sum(j) = (data(i,1)-center(j,1))^2+(data(i,2)-center(j,2))^2; end [m,index] = min(sum); data(i,3) = index; end %开始显示一批点 f = @(x)(x*50); col = arrayfun(f,data(:,3)); c_col = [1*times-20;2*times-20;3*times-20]; figure; scatter(data(:,1),data(:,2),[],col,'filled'); hold on; scatter(center(:,1),center(:,2),[],c_col,'filled'); pause(1); %现在寻找新的k个重心 new_c = ones(k,2); number = ones(k,1); for i = 1:k new_c(i,1) = 0; new_c(i,2) = 0; number(i) = 0; end for i = 1:12 new_c(data(i,3),1) = new_c(data(i,3),1)+ data(i,1); new_c(data(i,3),2) = new_c(data(i,3),2)+ data(i,2); number(data(i,3)) = number(data(i,3))+1; end delta = 0; for i = 1:k new_c(i,1) = new_c(i,1)/number(i); new_c(i,2) = new_c(i,2)/number(i); delta = delta + (new_c(i,1)-center(i,1)) ^2 + (new_c(i,2)-center(i,2))^2; end close; if abs(delta) < 1e-5 break else for i = 1:k center(i,1) = new_c(i,1); center(i,2) = new_c(i,2); end end end %开始显示一批点 f = @(x)(x*50); col = arrayfun(f,data(:,3)); scatter(data(:,1),data(:,2),[],col,'filled'); hold on; scatter(center(:,1),center(:,2),[],c_col,'filled'); pause(1); time = time+1;
测试效果
给隔壁一个用Matlab作gif的巨佬打个广告:(十分给力)如何用MATLAB来制作GIF动画_Data跳动的博客-CSDN博客_matlab制作gif
还在持续更新中……(为美赛做的微不足道的准备)