Matlab 随笔集

MATLAB随笔集

@(matlab笔记)[matlab笔记 小技巧]

1 MATLAB 修改默认启动路径/初始文件夹

Starting in R2014b, you can change the startup folder using the General Preferences panel. On the Home tab, in the Environment section, click Preferences. Select MATLAB > General. Choose an option for the Initial working folder.
By default, the initial working folder is set to Location based on MATLAB startup rules.

从 R2014b 开始,您可以使用“常规预设项”面板更改启动文件夹。在主页选项卡上,点击环境部分中的预设。选择 MATLAB > 常规。选择初始工作文件夹选项。
默认情况下,初始工作文件夹设置为基于 MATLAB 启动规则的位置。


但是在配置2017a时,,出现了设置初始文件夹失败 (不是提示,就是按照以上方法设置, 但是一打开,初始工作目录并没有改变。)不知道为啥。
后来通过以下方法设置成功:

右击MATLAB启动图标,选择属性
快捷方式选项卡中,有个起始位置
起始位置中,修改初始工作目录

2 matlab 格式自动重排 快捷键

CTRL+I

3 unique 函数可以删除一个数组/元组中的重复元素

例如:
a=[1,23,4,4,45,5,5,7];
b=unique(a);
运行结束后 b=[1,4,5,7,23,45];
会自动调整数组里面元素的顺序。按照从小到大的顺序重排列.
如果不希望调整,可以这样写:
[~,i,~]=unique(a);
b=a(sort(i));
运行结束后 b=[1,23,4,45,5,7];

4 dir 获取指定文件夹下/子文件夹下的文件列表

1) 获取文件下文件
假如读取F盘English文件夹中的所有bmp图片:

         Files = dir('F:\english\*.bmp'); 
              %获取english文件夹下的所有bmp文件相关信息.返回的Files是一个结构体   

2) 获取文件夹下及其子文件夹下所有文件
假如读取F盘English**文件夹及其子文件夹**中的所有bmp图片:

        Files = dir('F:\english\*/*.bmp');  

或者写为

        Files = dir('F:\english\**/*.bmp'); 

5 缺少文件/图片的读取权限

imread(‘facedata\s2\’, num2str(k), ‘.bmp’) ;
提示: 无法打开要读取的文件 “facedata\s2\”。您可能没有读取权限。
注意上面没有加括号:[]
imread([‘facedata\s2\’, num2str(k), ‘.bmp’]) ;
加了括号[],就可以正常使用了

6 MATLAB当前目录下的相对路径

当前路径下 (mat和m文件在一起): load *.mat;
在下一级路径下: load .\下一级路径的文件名***.mat;
在上一级路径下: load ..***.mat;
在平行文件夹内: load ..\平行的文件夹***.mat;

例如,读写当前目录下aaaa文件夹中的x.txt文件

fid = fopen('.\aaaa\x.txt', 'wt'); 
fprintf(fid, '%s\n', '1234'); 
fclose(fid)

7 确认数组中是否已有某个指定元素

函数 ismember
Lia = ismember(A,B) returns an array containing 1 (true) where the data in A is found in B. Elsewhere, it returns 0 (false).

 Lia = ismember([0 1 2], [1 2 3 ;4 5 6;7 8 9])

Lia =

     0     1     1

注意 这个函数的使用范围很广,可以查询多种类型的元素

8 读取EXCEL/Table 文件

用matlab读取Excel文件. Excel文件其实就是matlab中 table类型变量.
读取Excel类型文件有两种方法

eg: example.xls 为
汤姆 19990302
小红 19940803
1

xlsFile = xlsread('example.xls');

以上只能入读example.xls中 第一 sheet数值部分,
则返回的xlsFile
19990302
19940803

若想读入全部信息:

[num,txt,raw] = xlsread('example.xls');

num为       txt为    raw
19990302       汤姆    汤姆 19990302       
19940803       小红     小红 19940803       

xlsread函数具有多个参数.这样读入会很灵活(麻烦),具体详见matlab help xlsread,或者这位博主的 解释

第二种方法(不是很实用,  )
2 把xlsb

xlsFile= readtable('example.xls');

.xls纯粹当做table 型变量来读入,简单粗暴.再利用 cellFile = table2cell(xlsFile )可将其转化为cell型变量, 但是注意一点xlsFile表头将被忽略, 单纯的xls文件,往往所谓的表头也是实际数据内容,所以,也要保留的.

所以保留xlsFiLE中完整信息的写法是

xlsFile = readtable('example.xls');
cellFile = table2cell(xlsFile);
cellFile = [xlsFile.Properties.VariableNames;cellFile];
%把表头和内容拼接.

注意:在把表头取出来的时候有点问题,自己注意.比如说我的原本的xls文件中第一行元素被当表头去除时, 标点符号”.” 被转化成了”_”,这方面要注意

9 获取元胞数组cell中指定元素的索引

example:

a{1} = 'aa';
a{2} = 'bb';
a{3} = 'cc';
%现在想找到'cc'所在的索引

%方法一
IndexC = strfind(a, 'cc');
Index = find(not(cellfun('isempty', IndexC)));

%方法二
Index = find(ismember(a, 'cc'))

看起来方法二比方法一更为方便,但是实际上方法1更为灵活。比如,a{3} = 'ccc', 利用方法二将找不到'cc',但是方法一却能找到。也就是方法一可以找寻到子元素。但是方法二不能.
具体用哪一个根据需求而定

10 Matlab中利用K-Means聚类对图像分割

clc;clear; close all;
testImg = imread('lena.png');
testImg = imresize(testImg, [200, 200]);
if size(testImg, 3) > 1    
    testImg = rgb2gray(testImg);
end
imshow(testImg); title('the original image');
kClusters =3;% the number of cluseters

X = testImg(:);
[idx, centroid ] = kmeans(double(X), kClusters);
centroidVal = double(X(round(centroid)));
k_idx = cell(kClusters, 1);
newImg = zeros(size(testImg));

%分别给每一类中的元素赋予centroid所具有的值
for i = 1 : kClusters
    [xCoor, yCoor] = ind2sub( [size(newImg,1), size(newImg,2)], find(idx==i) );
    for j = 1 : length(xCoor)
        newImg(xCoor(j), yCoor(j)) = centroidVal(i);

    end
end
figure; %result of clustering image
imshow(newImg, []); title('the result of K-Means(K = 3) ')

figure;% display in scaled color
imagesc(reshape(idx, [size(testImg, 1), size(testImg, 2)]) );title('display result in scaled color')
axis off;

@这里写图片描述|center
@聚类结果|center
@可视化聚类的索引 | center

11 Matlab的parfor

**1)**parfor中的load save
parfor中无法使用load, save 解决方案
load save写入子函数, 然后在parfor 中调用子函数来间接loadsave

2) parfor中赋值给cell数组
parfor中
a{1, 1} = ‘xx’; a{1, 2} = ‘xxxx’;
a(1, :) = {‘xx’, ‘xxxx’};

12 isa 判断变量所属类别

isa
isa()
Determine if input is object of specified class
Syntaxtf


tf = isa(obj,ClassName)
tf = isa(obj,classCategory)

e.g.

isa(pi,'double')
ans =

     1

13 num2cell && mat2cell 的异同

matrix转化成 cell数组。

num2cell,根据输入的matrix的大小,输出固定大小cell数组。(通过将每个元素当做一个cell,或者将每一列/行当做一个cell)

%数值数组 转 cell
a = [1 2 3];
b = num2cell(a);
------------------
b =
  1×3 cell array
  [1]    [2]    [3]
a = [1 2 3;...
     4 5 6];
b = num2cell(a, 1);
c = num2cell(a, 2);
------------------
b =
  1×3 cell array
  [2×1 double]    [2×1 double]    [2×1 double]
b{1} = [1;4] b{2} = [2;5] b{3} = {3;6}
c =
  2×1 cell array
  [1×3 double]
c{1} = [1 2 3] c{2} = [4 5 6]
%字符数组 转 cell
c = ['abc'; 'def'];
d = num2cell(c);
------------------
d = 
  2×3 cell array
  'a'    'b'    'c'
  'd'    'e'    'f'

mat2cell,根据输入的matrix大小,以及指定大小,来输出cell

X = reshape(1:20,5,4)'
C = mat2cell(X, [2 2], [3 2])
------------------
X =
     1     2     3     4     5
     6     7     8     9    10
    11    12    13    14    15
    16    17    18    19    20

C = 
    [2x3 double]    [2x2 double]
    [2x3 double]    [2x2 double]

C{1,1} =                        
     1     2     3
     6     7     8

C{2,1} =
     11    12    13
     16    17    18

C{1,2} =
     4     5
     9     10

C{2,2} =
     14    15
     19    20

mat2cell 通用法则

18 元素运算/捷径运算

在matlab中, 我做两个向量A,B的”与”时,A&&B时出错,搞得我好郁闷,后来仔细琢磨了一下,才发现matlab 中的逻辑运算分为 元素运算与捷径运算……. matlab 细节好多啊

元素运算符&、|、~、xo
捷径运算符&&、||

运算类型运算符与函数说明
元素运算& (and)逻辑与
元素运算 | | (or) 逻辑或
元素运算 ~ (not) 逻辑非
元素运算 xor 逻辑异或

matlab中最本质的逻辑运算符就是以上几种。其中matlab又针对逻辑与,逻辑或的特殊性(为0则全0;为1则全1),引进了捷径运算

运算类型 运算符与函数 说明
捷径运算 && 捷径与
捷径运算 ||捷径或

捷径运算,指的是:若通过第一个(或者某一个)结果,便可知道整个逻辑运算的结果,则直接得到结果,不必往下运算。
for example:
0&&1,明显在第1个数字0处已经可以判断整体的结果,就不必再往下判定,因此,这种运算逻辑提供了捷径,称为捷径运算。
   注意: 捷径运算只适用于    标量

19 函数:inpolygon 判断某点是否在一个多边形内部/边界

函数: inpolygon
效果: 可以用来判断, 某一个点是否在多边形的内部或者边界上, 具体见help

vertex_xCoord= [0 3 3 0 0]; %多边形顶点的 x坐标
vertex_yCoord= [0 0 3 3 0];%多边形顶点的 y坐标
x=1.5; %待判断点的 x坐标
y=1.5;  %待判断点的 y坐标
[in,on]=inpolygon(x,y,vertex_xCoord,vertex_yCoord);%点是否在内部或者边上

20 函数:extractfield 用于提取struct中指定field中的所有元素

函数: extractfield
效果: extractfield(struct, ‘field’),提取指定field中的所有元素。

现有以下struct: person_infor

Fieldsnameage
1‘Tom’13
2‘Jerry’15
3‘Lisa’17

person_name = extractfield(person_infor, 'name');
person_age = extractfield(person_infor, 'age');

结果如下

person_name =

  1×3 cell array

    'Tom'    'Jerry'    'Lisa'
person_age =
      13    15    17

类似效果操作: [ struct(:).field ] 注意中括号,一定要有!

 person_name = [person_infor(:).name];
 person_age = [person_infor(:).age];

结果如下:

person_name  =

    'TomJerryLisa'
person_name   =

    13    15    17    

可以看到两种不同的操作方式在,field中内容是字符串时,结果有很大的不同, 这点要注意。本质上函数 extractfield更符合我们的要求。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值