matlab与常见算法笔记

一、绘图基础

生成数组的一些方式

(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);

matlab与常见算法笔记_第1张图片

多图绘制

(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);

matlab与常见算法笔记_第2张图片

(2)想先后绘制不同的图,且不想被覆盖,则用

%画第一幅图close;figure;%画第二幅图..

close用于关闭绘图窗口,figure用于创建新的绘图窗口

二、K-means实现

前面几个是因为没系统学过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

还在持续更新中……(为美赛做的微不足道的准备)

你可能感兴趣的:(笔记,matlab,矩阵)