记录一些Matlab用法
来源:互联网 发布:iphone一键刷机软件 编辑:程序博客网 时间:2024/05/16 17:21
记录一些Matlab函数用法
matlab需要用sudo命令启动
有时安装matlab后需要使用root权限才能启动,可下面命令改回来:
sudo chown username -R ~/.matlab
保存workspace中的变量
- workspace 中的变量可以直接保存:
save(‘path’,’variable’); - 使用时:
a = load(‘path’);
绘图
- 使用 hold on,绘制多条曲线
for i = 1:length()
hold on
plot(variable-1,variable-2,'LineWidth',3,'MarkerSize',3);
end - plot(x, y); % 以x为自变量,y为因变量的函数曲线;
- subplot(m, n, p); % 将多个图画到一个面板上;m是排成m行,n是排成n列,p是具体figure到哪个位置;
- bar(x); % 绘制二维竖直直方图
- bar3(x); % 绘制三维竖直直方图
- barh(x); % 绘制二维水平直方图
- bar3h(x); % 绘制三维水平直方图
- eg.
lv = sum(img, 2); %行相加
bar(lv); % 画直方图 - 绘制多边形区域
- roipoly函数用来制定图像的感兴趣多边形区域;
- BW = roipoly(I, c, r); %I是输入矩阵,返回二值图像中,包含由向量c和r指定的多边形区域,其中c,r对应的是横纵坐标信息
函数传递可变参数
- 把函数参数列表的最后一个参数写成varargin,在函数内部就能以访问cell数组的方式来获取可变参数的信息
function a('','',varargin)
取整函数
- fix朝零方向取整,如fix(-1.3)=-1; fix(1.3)=1;
- floor,就是地板,取比它小的整数,即朝负无穷方向取整,如floor(-1.3)=-2; floor(1.3)=1;
- ceil,是天花板,取比它大的最小整数,即朝正无穷方向取整,如ceil(-1.3)=-1; ceil(1.3)=2;
- round四舍五入到最近的整数,如round(-1.3)=-1;round(1.3)=1;
矩阵操作
- a = a(end:-1:1); % 数组倒序
图像处理uint8与double的转换
- a = double(a); matlab 读入图像后,一般需要将其转换为double类型
- a = uint8(a); matlab 存储图像时,一般需要将其转换为uint8类型
结构元素操作
- strel函数用于操作膨胀腐蚀及开闭运算等的结构元素对象
- SE = strel(shape,parameters); % shape 为’disk’,’line’等形状;parameters一般控制SE的大小
找出矩阵X的所有非零元素
- index = find(X); %% 将这些元素的线性索引值(按列)返回到向量index中
- index = find(X, k) %% 返回第一个非零元素k的索引值
画线
- line([a c e]’, [b d f]’); %%画一条从[a,b] 到[c,d],从[c,d] 到[e,f]的直线,以此类推
- eg. line([x1 x1 x2 x2 x1]’, [y1 y2 y2 y1 y1]’, ‘color’, c, ‘linewidth’, 3);
- a,b,c,d并不一定是一个数,也可以是数组;
- 配合
drawnow
使用;
调整图框
gca
- 获取当前图形窗口中当前坐标轴的句柄值;
- set(gca,’position’,[]);设置坐标轴距离画板(图形窗口figure)边距;
- set(gca,’position’,[0.1,0.1,0.9,0.9] );分别为axes在figure中的左边界,下边界,宽度,高度,最小为0,最大为1(左边界,下边界为0,上边界,右边界为1);
gcf
- 获取当前图形窗口的句柄值;
- set(gcf,’unit’,’normalized’,’position’,[]);设置图形窗口的形状;
- set(gcf,’unit’,’normalized’,’position’,[0.2,0.2,0.64,0.32]);使图形窗口在屏幕上的显示位置是以(0.2,0.2)为原点,长0.64,宽0.32;同gca一样,仍然是左边界,下边界为0。
- 其中,gcf的position也可以不是normalized。
求和
- sum(a); %% 对矩阵a按列求和
- sum(sum(a)); %%将矩阵按列求和后,再按列求和,亦即矩阵所有元素相加
矩阵操作
- any %% 矩阵是否有非零元素
- all %% 矩阵是否全部都是非零元素
- B = all(A); %% 如果A是一个矩阵,则返回一个行向量,用于检测每一列是否全为非零元素,如果某一列中有一个元素为零,则返回0,如果某一列中全为非零元素,则返回1,由此构成一个行向量。
- B = all(A, 1); %% 返回一个行向量,可以认为all(A, 1)等价于all(A)
- B = all(A, 2); %% 返回一个列向量,用于检测每一行是否全为非零元素,如果某一行中有一个元素为零,则返回0,如果某一行中全为非零元素,则返回1,由此构成一个列向量。
- assert(all(all(abs(K1-K2)<1e-12))); %用来判断两个矩阵是否相等
k1=[1,2;3,4];
K=zeros(4);
K([1 3],[2 4]) = k1; % [1 3]指的是行,[2 4]指的是列
K =0 1 0 2
0 0 0 0
0 3 0 4
0 0 0 0
结构体操作
- points(1).x=1;
points(1).y=1;
points(2).x=3;
points(2).y=4;
index = find([points.x]’==3); %查找某个结构体元素的索引号 - u = struct();
u(1).message = 1;
u(2).message = 2;
u(1) = [];
u(2) = []; %结构体删除
向量运算
- array(array>1)=0; %%把大于1的元素变为0
- array(and(array>1,array<3))=0; %%把大于1小于3的元素变成0
取代断点
- dbstop if error; %% 如果运行出现错误,matlab会自动停在出错的那行,并且保存所有相关变量。再也不用设断点了
堆叠矩阵
- B = repmat(A,m,n);
eg.
B=repmat( [1 2;3 4],2,3)
B =1 2 1 2 1 2 3 4 3 4 3 4 1 2 1 2 1 2 3 4 3 4 3 4
矩阵相关
- img = img(:); %将矩阵变为一维向量
- X = cat(3, A, B, C); %构造三维矩阵,A,B,C都是二维矩阵
- X(:, :, 1) = A; %构造三维矩阵
X(:, :, 2) = B; %A,B,C都是二维矩阵
X(:, :, 3) = C; - X = zeros(row, col); %目前暂时只找到这一种构建指定大小矩阵的方式
忽略某些返回参数
- [~, idx] = max(a); %%忽略最大值,只返回最大值的索引
代码运行耗时显示
tic;
some_code_to_run();
toc;
转化为列向量
- b = a(:);
检测某目标(如变量)是否存在
- b = exist(a); %%若 a 存在,则 b = 1; 否则 b = 0;
- b = exist( ‘name’, ‘kind’); %% kind 表示 name 的类型,可以取的值为:builtin(内建类型),class(类),dir(文件夹),file(文件或文件夹),var(变量)
函数句柄
- f = @(x)acos(x);
- f 是函数句柄
- @是定义句柄运算符
- (x)是输入自变量
调用方式为f(x),相当于下面的函数文件
function y = f(x)y = acos(x)
意义在于能够提高运行速度,因为普通函数的运行需要在所有路径中搜索,所以常用函数用句柄方式调用能够减少运行时间
向量化编程
- a = {1:10, [2; 4; 6], []};
- averages = cellfun(@mean, C);
- averages =
5.5000 4.0000 NaN
- b = {[1 2 3] [4 5 6]};
- [nrows, ncols] = cellfun(@size, C);
- nrows =
1 3 0
ncols =
10 1 0
- 自定义函数
- days = {‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’};
- abbrev = cellfun(@(x) x(1:3), days, ‘UniformOutput’, false);
- 第一项为函数句柄和函数定义;中间为输入;末尾UniformOutput指定不同输入元素对应的输出是否能够合并,false指不能合并,这样每个输出就分别是一个cell,整个输出是非标量型的。
- 注:{‘matlab’,’中国’}是标量元胞数组;{{‘matlab’},{‘中国’}}则是非标量元胞数组。
- 可以自定义嵌套函数
尺寸
- [rows, cols] = size(mat); %返回的是行数和列数,所以得到的分别是“高”和“宽”,老搞混 -,-
- 在获取rgb图片的size时,需要将维度也获取,否则宽度就会等于宽度和维度的乘积
剪裁
- imcrop(img, [x_min y_min width height]); % 左上角点坐标,宽度和高度
随机数生成
- randi(iMax); % 在开区间(0,iMax)生成均匀分布的伪随机整数;
- randi(iMax,m,n); %在开区间(0,iMax)生成m*n型随机矩阵;
- r = randi([iMin,iMax],m,n)在开区间(iMin,iMax)生成m*n型随机矩阵;
- 还有randn和rand等函数。
三目运算
- matlab中没有三目运算;
- 可以通过逻辑实现;
- 要实现 D = (A>0)?B:C 可以通过D = (A>0)*B+(A<0)*C 实现;
- 与之有异曲同工之妙的是,一个常用来抠图的做法:设置好mask,然后点乘(.*),如此一来,想要的地方保留,不想要的地方就被乘为0了。
坐标|索引互转
- ind=sub2ind(size(A), I, J); %size(A)表示要转换的矩阵的行列数,I是要转换矩阵的行标,J是要转换矩阵的列标。ind即为索引;
- [I,J] = ind2sub(size(A), find(A>5)); %ind2sub函数可以用来把特定条件下的矩阵元素的index转换成对应的下标。
根据像素值将矩阵展示为彩色图
- imagesc(A); %将矩阵A中的元素数值按大小转化为不同颜色,并在坐标轴对应位置处以这种颜色染色;
- imagesc(x,y,A); %x,y决定坐标范围,分别是两个二维向量,即x=[x1 x2],y=[y1 y2],matlab会在[x1,x2][y1,,y2]的范围内染色。如果x或y超过两维,则坐标范围为[x(1),x(end)][y(1),y(end)];
- colormap 可用于热度图的生成。
矩阵合并
- C = cat(dim, A, B); %按dim来联结A和B两个数组;
- C = cat(dim, A1, A2, A3, …); %按dim联结所有输入的数组;
- a=cat(3,A,B) 左括号后的3表示构造出的矩阵维数,在新的矩阵中第1、2维就是A和B这两个矩阵的行数和列数,第3维是A和B这两个矩阵的矩阵个数,即为2;
- cat(2, A, B); % 相当于[A, B]; cat(1, A, B)相当于[A; B].
文件读取
假拟一个file.txt,内容为:
Sally Level1 12.34 45 Yes
- [data1,data2,data3,data4]=textread(‘file.txt’,’%n%n%n%n’); % 无分隔符
- [data1,data2,data3,data4]=textread(file,’%n%n%n%n’,3);%3为读取次数,应该是行数
- [data1,data2,data3,data4]=textread(‘file.txt’,’%n%n%n%n’,’delimiter’, ‘,’); % 有分隔符
- [data1,data2,data3,data4]=textread(‘file.txt’,’%n%n%n%n’,’delimiter’, ‘,’,’headerlines’, 3); % 有分隔符,并且跳过前三行
- [names, types, x, y, answer] = textread(‘file.txt’ , ‘%s %s %f %d %s’, 1); % 针对txt文件不同格式数据的读取
- [names, types, y, answer] = textread(’file.txt’ , ‘%s %s %*f %d %s’, 1); %*f 告诉textread跳过一个浮点数
- [names, levelnum, x, y, answer] = textread(‘myfileli4.txt’,’%s Level%d %f %d %s’, 1); %忽略“level”字符串,只读取后面的数字
- [data1 data2 data3 data4 data5 data6] = textread(‘file.txt’,’%f%f%f%f%f%f’, ‘delimiter’, ‘,’, ‘emptyvalue’, NaN); %假如文件中有空位,使用指定内容来代替空位
- [names]=textread(‘file.txt’,’%s%[^\n]’); %只读第一列,其余跳过; [^\n] 是一直读到行尾; % 是一个跳过符号,表示跳过该位
- [location year month day hour minute discharge]=textread(‘myfileli7.txt’,’%s%f-%f-%f%f:%f%f’,’headerlines’,1,’delimiter’,’;’); %用来读取规律格式的数据
例如,文件中有如下内容:
Lobith;1989-01-01;00:00;2801 Lobith;1989-01-02;00:00;2619 读取为: location = 'Lobith' 'Lobith' year = 1989 1989 month = 1 1 day = 1 2 hour = 0 0 minute = 0 0 discharge = 2801 2619
注:参考自知乎和这篇帖子
1 0
- 记录一些Matlab用法
- 记录一些简单的matlab用法
- Matlab一些函数用法
- 一些SWING用法记录
- ps一些用法记录
- 记录jQuery的一些用法
- 记录一些kotlin的用法
- 记录numpy的一些用法
- Matlab中一些函数及其用法列表
- matlab&octave 中plot的一些用法
- matlab 一些函数用法(不断补充)
- 记录VI的一些高级用法
- 记录一些简单实用的vim用法
- 报表控件DevExPress的一些用法记录
- IBATIS3的一些用法记录[整理]
- python的一些函数用法记录
- Dictionary一些简易用法记录,方便…
- git初次接触记录简单一些用法
- Java 序列化 和 反序列--by Vincent
- Android-沉浸状态栏以及状态栏背景色如何设置
- Spring Bean
- H.264视频码流解析
- ios object_c网络post和get的个人见解
- 记录一些Matlab用法
- Days22 Broadcast
- umask详解
- windows服务和进程的区别和联系
- jsp学习笔记(十一):在jsp用ajax请求微信接口时,返回错误,提示status:0,statusText:error
- java练习--直角
- .使用面向对象思想,输出员工信息并计算员工的工资。实现过程为:定义一个部门(Department)类,该类有部门编号(Id)、部门名称(Name)属性; 再定义一个员工(Employee)类,该类的属
- 应用集成实战系列:什么时候需慎重使用服务总线
- 文章标题