matlab笔记:久未使用之后踩的一堆坑

本周科学计算引论结课了,就花了一整天时间把要求的实验报告写了。根据考核说明,算法可以使用各种工具、语言来实现,但由于这门课程的上机实验统一使用的是matlab,再加上我上一次使用matlab大量实践是在劳动节的数学建模华中赛了,还是很有必要重拾起来再熟悉一下。于是乎,一大波坑就等着我去填了。

References

电子文献:
https://blog.csdn.net/zhanshen112/article/details/79728887


报错:未找到具有匹配签名的构造函数

我编写了一个二分法的函数求解非线性方程,然而当我调用的时候,却遇到报错:“未找到具有匹配签名的构造函数”,这是怎么回事呢?
我们来冷静分析一下。

识破!
原来是我定义的函数名为half,而half也是matlab自带的函数之一,可以使用help functionname查看函数具体的使用方法与功能。

调用时默认优先使用自带的函数,因此修改函数名为matlab自带函数之外的即可。


报错:矩阵维度必须一致

这是我在画图时遇到的一个问题,首先先补充一下matlab中作函数图像的方法,如下图所示。

当我尝试使用上述方法作简单的函数图像时,并没有报错,而当我想要作出我实验所需函数(如下所示)的图像时,却出现了“矩阵维度必须一致”的错误信息。

1
y = asin(1 / (1.878 + 0.75 * cos(x)))

查阅相关资料,我才发现是乘除的时候出现的问题,为此我将其中的除/修改为乘*,并用.^代替^作乘方计算,即将原函数式修改为:

1
y = asin(1 * (1.878 + 0.75 * cos(x)) .^ (-1))

这样,问题就解决了。
这里我想强调一下在matlab中^.^的区别:.^是点乘,而^是乘法。
直接用^进行乘法的话,在这里即矩阵乘法,也就是说,必须满足前一个矩阵的列数等于后一个矩阵的行数。
而使用.^点乘操作,是使每一个元素相乘,也就是向量或者矩阵中对应元素相乘,也很好记忆,加个点就是点乘。


函数输出只有一个

这是一个很愚蠢的问题,显然我好久没用了,因为matlab不必使用return返回结果,在函数声明的第一句就确定了返回值的数量和顺序。因此在调用函数的时候,必须也提供对应的变量去接收返回值,否则只能得到第一个返回的元素。


使用diff求导不是导数值

用惯了pytorch,总想着能够自动求导,一查matlab还真有这么一个函数,即diff函数。然而,事实证明它不是我想要的。
我们可以在命令行中使用这一个函数:

  1. 声明变量x:syms x。它代表着声明符号变量x,只有声明了符号变量才可以进行符号运算,包括求导。
  2. 定义一个需要求导的函数:f(x) = sin(x) + x ^ 2
  3. 使用diff函数求导:diff(f(x))。也可以对已经定义好的m文件中的函数直接求导。
    这里,我们会得到ans为2*x + cos(x)
  4. 如果想pretty一些,可以使用pretty函数将结果转化成书面格式:pretty(ans)

然而,当我代入不同的具体数值想得到函数的导数值的时候,发现输出的结果却是0。
使用help查阅diff函数的用法,得到的说明是:

1
2
3
4
此MATLAB函数计算沿大小不等于1的第一个数组维度的X相邻元素之间的差分:
Y = diff(X)
Y = diff(X,n)
Y = diff(X,n,dim)

原来这个函数的主要用法是对向量或者矩阵中的元素进行差分计算,当用它来求导时,得到的只是一个表达式,且函数一但复杂,得到的就是一个参数众多的逼近格式。
唉,总而言之,还是老老实实地拿起笔自己算出导函数吧。都用矩阵实验室(matlab)了,手动求个导还是得会的呀。


角度制弧度制互换

无论使用计算器还是编程计算,这都是一个需要注意的点,matlab默认使用的是弧度制,在计算出结果之后,可以使用rad2deg函数进行转换。
同样的,我推测角度制转弧度制的函数名为deg2rad,一试,果不其然。这个函数还是挺好记的,英文里有许多同音词与字符的妙用,比如这里的to和2的two,还有at和@,感觉既方便又高级。


保留更多位数

matlab默认是保留4位有效数字,为了提升计算精度,可以使用format long来增加计算过程中保留的位数。


常用操作

难得开一篇写matlab使用的博文,那就在这补上几个我记忆中的较为常用的命令或操作。

  1. Ctrl+C终止操作。这跟许多地方都一样,在matlab中,Ctrl+C平时可以用来粘贴剪切板上的内容,而在程序运行时,可以使用它来终止运行,这在死循环的时候非常有用。
  2. clc清空命令行。
  3. bench测试性能。这其实不是一个很常用的命令,可以跟朋友输这个命令看看自己电脑的性能,下图是我的结果。需要注意的是,笔记本电脑电池使用模式的不同对这个排名影响还是挺大的,如果想让排名高一些的话,请确保电池开在最佳性能的模式。另外,不同的电脑的比较对象可能会不一样,比如学校的台式机和我的笔记本在这里比较的对象就不一样。 常用的还有许多,以后在使用中不断增加,先在这占个位。
    最近在b站看到matlab的几个有趣彩蛋,挺有意思,感兴趣可以去瞧瞧。

碰到底线咯 后面没有啦

本文标题:matlab笔记:久未使用之后踩的一堆坑

文章作者:高深远

发布时间:2019年11月10日 - 19:36

最后更新:2020年02月07日 - 17:31

原始链接:https://gsy00517.github.io/matlab20191110193640/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%