致所有新晋Matlaber
某Matlab萌新:“有大佬知道xxx怎么xxx吗?跪求...”
我相信在许多Matlab群里,甚至知乎上,也不乏这种提问,这里想说的是:同学们!硬气一点!不要“跪”,也不要“求”。
0 文章目的:
本文会持续针对一些萌新遇到的问题,并给出解答。这类问题包括: 常规操作 , 库函数 , 常见报错 。同时也会给出一些 冷门但是独具风骚 的操作。因此本文会不定期更新,欢迎持续关注。(注明:文章内所有相关内容基于Matlab2014b版本)
新增第三模块:代码示例篇: 短短几行码,带你领略Matlab。同时,感兴趣的朋友,有新的解题思路,可以在评论中留言。
最新更新:问题篇18,Simulink无限时长交互式仿真
目录
问题篇
1. 问:help文档、simulink模型查看器之类的窗口,显示字体太小怎么办?
2. 问: Matlab搜索路径怎么设置?(执行程序显示找不到该文件(该函数),但是明明文件已经创建)
3. 问:索引超出矩阵维度是怎么回事?
4. 打开Matlab闪退,打开Matlab总出现初始化失败等情况
5. cell应用出错等情况
6. 你是不是用错了find(1<x<5)?
7. 三维网格图你画对了吗?
8. matlab如何快速加载.xml文件
9. 自定义函数产生的中间变量导入workspace
10. Simulink偷我波形图?
11. Simulink仿真时间怎么获取?
12. Matlab画局部图
13. isequaln — 无懈可击
14. Matlab如何实现集合运算
15. 保存训练完后的神经网络
16. 报错:下标索引必须为正整数类型或逻辑类型。(更新)
17. 向量/向量=标量?(更新)
18. Simulink无限时长交互式仿真
操作篇
1. 逻辑索引
2. sum番外篇
3. 函数家族
4. cell添加成员
5. demo—Matlab的私房钱
6. doc—你的matlab目录
7. bsxfun函数,你值得拥有
8. NaN—“Not a Number”
9. matlab function的“重载”
10. Matlab图形编辑直通车
11. 进击的匿名函数
12. 限制函数输入变量
13. Matlab&Python相爱相杀——Matlab写python
14. try-catch——从小白到进阶的标志!
15. repmat——实现矩阵平铺 && kron——实现克罗内克积
代码篇
1. 不使用库函数获取数组长度
一 问题总览:
1. 问:help文档、simulink模型查看器之类的窗口,显示字体太小怎么办?
答:先按住ctrl,再按+或者-可以实现字体的大小变换
2. 问: Matlab搜索路径怎么设置?(执行程序显示找不到该文件(该函数),但是明明文件已经创建)
答:
这两个选项都可以把你的文件所在的文件夹添加到路径中
3. 问:索引超出矩阵维度是怎么回事?
c = [0 0 0 0 0]
c(10) %索引超出矩阵维度。明明c只有5个元素,你却要访问第十个,故而报错。
for i = 4:7
k = c(i)
% 试图访问 c(6);由于 numel(c)=5,索引超出范围。
4. 打开Matlab闪退,打开Matlab总出现初始化失败等情况
答:亲,这边建议您卸载重装呢!
可以前往微信公众号: 豪杰仿真科技
下载相关资源哦!
5 . cell应用出错等情况
对于cell类型的变量,花括号{}索引具体内容,中括号[]索引对应 cell块
mycell = {'abc',[1,2,3]}
mycell(2)+1 %报错,未定义与 'cell' 类型的输入参数相对应的函数 'plus'。
mycell{2}+1 % ans = [2 3 4]
mycell(2) = [] % mycell 1×1cell
mycell{2} = [] % mycell = {'abc',[ ]}
6. 你是不是用错了find(1<x<5)?
字面上的1<x<5,翻译成为x小于5且x大于1,而程序中的1<x<5,在Matlab中翻译为x小于5或x大于1,那么:
x = 1:6
find(1<x<5) % ans = [1 2 3 4 5 6]
find(1<x&x<5) % ans = [2 3 4]
7. 三维网格图你画对了吗?
x = -1:0.1:1;
y = -1:0.1:1;
[x1,y1] = meshgrid(x,y);
x2 = meshgrid(x);
y2 = meshgrid(y);
z1 = x1.^2+y1.^2;
z2 = x2.^2+y2.^2;
subpolt(1,2,1);mesh(x1,y1,z1); % 左图
subplot(1,2,2);mesh(x2,y2
,z2); % 右图
8. matlab如何快速加载.xml文件
1) matlab自带函数xmlread
2)第三方库xml_io_tools (获取:1. mathworks file exchange; 2. 公众号: 豪杰仿真科技 )
9. 自定义函数产生的中间变量导入workspace
1)debug该函数,直到工作区出现该变量后,另存为.mat文件
2)使用assignin函数,示例如下
function y = fcn(a)
x = rand(a,a); %产生a行a列的随机数矩阵
assignin('base','my_variable',x); %将非输出量x输出到workspace,命名为‘my_variable’
y = fix(x); %四舍五入
end
10. Simulink偷我波形图?
20秒的仿真图,怎么只显示了这几秒?
莫慌,点击scope主界面左上角齿轮->点击History->修改Limit data points to last 的值
最终修改值应大于等于 当前值*仿真时间/显示时间(如上图,显示时间=20-Time offset = 3.6)
11. Simulink仿真时间怎么获取?
问这种问题时,其实一般不是要问下图这个SimuationTime
而是想要知道iSimulink仿真这20秒所经过的时间。
这个时间分两个阶段,一个是Update Phase,一个是Simulation Phase。分不清的话可以看下面两张图,第一张就是更新阶段,第二张就是仿真阶段
我们可以通过设置Simulink callback function来计算这两个阶段需要的时间:
点击顺序:File->Model Properties->Model Properties->Callbacks
InitFcn 对应模型更新开始;StartFcn 对应模型仿真开始;StopFcn对应仿真结束;
然后通过tic,toc来进行计时;这里,toc不能单纯地写成toc,需要定义一个变量,如time = toc;最后输出变量time就是对应阶段的时间
12. Matlab画局部图
>> x = 0:0.1:10;
>> y = sin(x);
>> plot(x,y)
出现一个图形窗口后,点击->插入->坐标轴(在合适区域选取)->右键新的坐标轴->添加数据->x数据源选用x,y数据源选用y,绘图类型plot->右键->显示属性编辑器->修改两个轴的显示范围->右上角取消停靠->关闭大的编辑窗口
13. isequaln — 无懈可击
A1 = [1 NaN NaN];
A2 = [1 NaN NaN];
A3 = [1 NaN NaN];
isequaln(A1,A2,A3) % ans = 1,说明isequaln对NaN也有效
14. Matlab如何实现集合运算
A = [7 1 7 7 4];
B = [7 0 4 4 0];
C = intersect(A,B);%A∩B,C = [4,7]
C = union(A,B); %AUB , C = [0,1,4,7]
C = setdiff(A,B); %A-B = setdiff(A,A∩B),C = 1
15. 保存训练完后的神经网络
方法一:手写。根据net的结构和参数写成function,麻烦,但是这样的代码解释性高,可以简易修改移植到其他地方(如python,matlab的s-function等)
方法二:保存为.mat文件
方法三:利用神经网络工具箱的genFuction函数生成matlab function,方便,但是移植性不强,代码示例如下:
[x,t] = house_dataset;
houseNet = feedforwardnet(10);
houseNet = train(houseNet,x,t);
genFunction(houseNet,'houseFcn');
16. 报错:下标索引必须为正整数类型或逻辑类型
g = 1
g(0) %这里会发生报错,以下是延伸情况
m = 1000;
g = 9.8;
l1 = 0.5;
l2 = -0.5;
T = m*g(l1+l2) %报错,其实想的是m*g*(l1+l2),但写成这样等同于 m*g(0)
17. 向量/向量=标量?
%%ex1
a = [1,2,3];
b = [4,5,6];
c = b/a % c = 2.2857
%% ex2
a = [1,2,3];
b = [2,4,6];
c = b/a % c = 2
%这是因为向量除法时,默认是寻找一个k,能够满足最小误差下逼近y = k*x
18. Simulink无限时长交互式仿真
有的朋友会在simulink仿真的时候,加入开关,或者其他仪表设备,并把仿真时间设为inf,但是一运行发现,这个仿真都是十几秒十几秒地跑,甚至越往后时间越快,而我们希望的是在比较短的时间内,比如20秒,来实现这种人机交互的开关切换之类的操作。
给出解决方法(18b亲测通过,而14b没有该选项):点击simulink模型界面上方Simulation->Pacing Options,看到如下界面:
滑动标尺往左,可以降低仿真速度(这个速度与model configure下的Max Step不是一个概念,Pacing Options是针对电脑自身硬件而言的,而Max Step是针对求解器而言的),将上图中标尺调到0.1左右,基本可以达到0.1s级别的交互。
二.你可能不知道的操作总览:
1. 逻辑索引
x=1:10;
out1 = x([1,1,1]);
%out1 = [1,1,1]
x=1:10;
out1 = x(logical([1,1,1]))
%out1 = [1,2,3]
2. sum番外篇
x = [];
y = sum(x);
%y = 0
3. 函数家族
famliy = {@(x) abs(x),@(x) x.^2+4};
% famliy{1}(2)=2
%famliy{2}(4)=20
4. cell添加成员
c = {'abc',[2,3,4],@(x) x^2}
c = {c,'efg'} %错误
c = {c{:},'efg'} %正确
5. demo—Matlab的私房钱
在命令行中输入demo,你会得到Matlab(不搜索的话,不会涉及到Simulink等)自带功能的所有函数和命令大全:包括基本语法、绘图、数据处理、用户界面、面向对象等。
6. doc—你的matlab目录
命令行中输入doc,你将会得到当前版本matlab的所有大型工具箱(是大型哦)
7. bsxfun函数,你值得拥有
a = [1,2;3,4];
b = [1,2];
a - b %错误使用 - , 矩阵维度必须一致。
bsxfun(@minus,a,b) % ans = [0,0;2,2]
8. NaN—“Not a Number”
a = NaN;
b = NaN;
a == b % ans = 0
a == NaN % ans = 0
isnan(a) % ans = 1
9 . matlab function的“重载”
function y = fcn(varargin)
% varargin 自动成为一个cell型变量
y = length(varargin);
fcn(1,2) % ans = 2
fcn(1:5) % ans = 1,这里,请细品
10. Matlab图形编辑直通车
命令行 demo 再搜索 figure properties(图形属性)或者 axes properties(轴属性)
>> h = figure()
Figure (1) (具有属性):
Number: 1
Name: ''
Color: [0.9400 0.9400 0.9400]
Position: [624 474 672 504]
Units: 'pixels'
%...(还有很多属性)
>> set(h,'name','hello world')
Figure (1: hello world) (具有属性):
Number: 1
Name: 'hello world'
Color: [0.9400 0.9400 0.9400]
Position: [624 474 672 504]
Units: 'pixels'
%...(还有很多属性)
11. 进击的匿名函数
f = @(x) x.^2;
g = @(x) 3*x;
h = @(x) g(f(x));
h(3) % ans = 27
% PS,匿名函数支持integral积分、ezplot直接出图、fminbnd寻优等
12. 限制函数输入变量
function v = findVolume(ht,wd,ln)
validateattributes(ht,{'numeric'},{'nonempty'},mfilename,'Height',1)
validateattributes(wd,{'numeric'},{'nonempty'},mfilename,'Width',2)
validateattributes(ln,{'numeric'},{'nonempty'},mfilename,'Length',3)
findVolume('1',2,3) % 错误使用 findVolume 需要的 输入数目 1, Height, 应为以下类型之一:
% double, single, uint8, uint16, uint32, uint64, int8, int16, int32, int64
% 但其类型是 char。
13. Matlab&Python相爱相杀——Matlab写python
pyvar = py.list([1,2,3]); % 1×1list
pyvar.append(4) %即便不加分号,也不会输出ans,符合python语法。
pynp = py.numpy.array([1,2,3]) % 1×1ndarray
pynp.mean % ans = 2。ps:通过methods函数可以查看该对象的可用的方法
14. try-catch——从小白到进阶的标志!
try-catch是很多语言中都必备的控制流。
%try:expression1
%catch:expression2
%若表达式1执行时系统报错,则执行表达式2
A = rand(3);
B = ones(5);
C = A + B;
catch
error('dimensions are not matching');
end
15. repmat——实现矩阵平铺 && kron——实现克罗内克积
a = eye(2) % a = [1,0;0,1]
repmat(a,2,2) % ans = [1 0 1 0;0 1 0 1;1 0 1 0;0 1 0 1]
kron(a,a) % ans = [1 0 0 0;0 1 0 0;0 0 1 0;0 0 0 1]
ps: 熟练使用kron,在自主编写最优化算法时有莫大优势
三 代码示例篇
1. 不使用库函数获取数组长度
function y = VectorLength(x)
i = 1;
while 1
x(i);
catch