致所有新晋Matlaber

致所有新晋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:10out1 = 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 + Bcatch
       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