MATLAB随笔集
@(matlab笔记)[matlab笔记 小技巧]
- MATLAB随笔集
- 1 MATLAB 修改默认启动路径/初始文件夹
- 2 matlab 格式自动重排 快捷键
- 3 unique 函数可以删除一个数组/元组中的重复元素
- 4 dir 获取指定文件夹下/子文件夹下的文件列表
- 5 缺少文件/图片的读取权限
- 6 MATLAB当前目录下的相对路径
- 7 确认数组中是否已有某个指定元素
- 8 读取EXCEL/Table 文件
- 9 获取元胞数组cell中指定元素的索引
- 10 Matlab中利用K-Means聚类对图像分割
- 11 Matlab的parfor
- 12 isa 判断变量所属类别
- 13 num2cell && mat2cell 的异同
- 18 元素运算/捷径运算
- 19 函数:inpolygon 判断某点是否在一个多边形内部/边界
- 20 函数:extractfield 用于提取struct中指定field中的所有元素
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;
11 Matlab的parfor
**1)
**parfor中的load
save
parfor中无法使用load
, save
解决方案
把load
save
写入子函数, 然后在parfor 中调用子函数来间接load
和save
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
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
Fields | name | age |
---|---|---|
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更符合我们的要求。