记录一些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
原创粉丝点击