【MATLAB】MATLAB的安装、配置与科学计算 || 软件手册
linjoe99 2024-09-03 15:35:01 阅读 61
【start:210125】
文章目录
引言软件对比与适用范围
MATLAB的基本配置安装 MATLAB安装 MATLAB Add-Ons(附加功能)安装matlab app(直接用.mlappinstall文件安装)
MATLAB的基本使用方法将xxx文件夹添加到MATLB路径`.m文件`:函数式文件&命令式文件(脚本)matlab的函数定义matlab的函数调用matlab代码编辑器中缩进的自动对齐`.mlx文件`:新建实时脚本
MATLAB的优势工作区能直接展示丰富的数据统计
在python中使用matlab库配置:在python环境中安装matlab库debug
在VSCode中调用matlab程序方法一:在VSCode中安装Matlab插件方法二:在VSCode中安装Matlab Unofficial插件优势互补在VSCode中写代码在matlab中运行代码
MATLAB与科学计算插值算法griddedInterpolant 和 interp1
解一元方程确定返回根的顺序
解微分方程数值积分
MATLAB App案例Mitometer App
MATLAB DebugDebug commands only allowed when stopped in debug mode.警告: 将图例条目限制为 50 个。指定图形对象的向量以显示 50 个以上的条目。Matlab命令semilogy不起作用文件被matlab占用时的删除方法
引言
MATLAB is a programming and numeric computing platform used by millions of engineers and scientists to analyze data, develop algorithms, and create models.
软件对比与适用范围
总结来说是:数值计算用matlab,解析计算用mathmatica,数据科学计算用python
MATLAB的基本配置
安装 MATLAB
【ref】MATLAB R2022b安装教程
注意,尽量安装b版本的matlab,因为一般b版本可以适配更高级的python,其中:
R2022a支持python 3.6
R2022b支持python 3.10
安装 MATLAB Add-Ons(附加功能)
有时执行代码出错时,matlab会提示我们:它需要额外的库:
*Note: You must have these <code>MATLAB Add-Ons installed:
“Statistics and Machine Learning Toolbox”(https://www.mathworks.com/help/stats/)
“Image Processing Toolbox” (https://www.mathworks.com/help/images/)
这时,为了安装新的matlab库,第一种方法是:
直接点击matlab的install.exe程序(安装程序)来安装所需的库:
如果使用的是正版matlab,那么还有第二种更便捷的方法是:
直接在matlab软件里进行操作,在“主页”中点击“附加功能”,在点击“管理附加功能”,然后安装自己所需的库:
安装matlab app(直接用.mlappinstall文件安装)
欲安装打包好的matlab app,直接点击mlappinstall文件安装即可:
MATLAB的基本使用方法
将xxx文件夹添加到MATLB路径
要运行此文件,您可以更改MATLAB当前文件夹,或者将其文件夹添加到MATLAB路径。
在运行函数之前,一定要把 M 文件所在的目录添加到 MATLAB 的搜索路径中,或者将函数式文件所在的目录设置成当前目录,使 mm.m 所在目录成为当前目录,或让该目录处在 MATLAB 的搜索路径上。
或者,可以让 Matlab 自动变更路径,参考:
【ref】matlab运行包含子程序时自动变更路径方法
<code>.m文件:函数式文件&命令式文件(脚本)
一个是function 定义的,叫函数;
另一个是脚本文件,执行的时候在matlab base内存空间运行。
【ref】MATLAB M文件详解
matlab的函数定义
下面是两个例子,一个包含函数定义,另一个是纯粹的脚本。
带有函数定义的例子:
<code>function f = mm
% This function demonstrates the use of "for" and creates a simple matrix
for i = 1:4
for j = 1:4
a(i, j) = 1 / (i + j - 1);
end
end
f = a; % Output parameter of the function
end
在这个例子中,mm
是一个函数,它创建了一个4x4的矩阵a
,然后将其作为输出参数返回给调用者。
不带函数定义的例子:
% This script demonstrates the use of "for" and creates a simple matrix
for i = 1:4
for j = 1:4
a(i, j) = 1 / (i + j - 1);
end
end
% You can directly display the matrix or perform other operations here
disp(a);
在这个例子中,没有函数定义,只有脚本。代码会直接创建矩阵a
,并通过disp(a)
在命令行窗口显示矩阵。这样的代码不具备独立的函数性质,只能按顺序执行。
matlab的函数调用
matlab读取函数要文件名还是函数名?
MATLAB中函数调用是通过文件名调用,所以函数文件名和文件里面的函数名,可以不一样,但是在命令窗口调用的是函数文件名。
matlab测试函数时,未定义变量,报错:输入参数的数目不足
自定义函数时,传递的都是形参,如果直接点击运行,没有传递实参给程序,也就“缺少参数”了。保存好自定义函数后,不要点击运行,在命令行窗口给定实参进行调用。
【ref】输入参数的数目不足?
为函数设置默认参数
案例:
function [Ef Nv Nc mn]=Fermi_level_position_calculator_(Nd0, Na0,T,Ef0,Eg)
% nargin 是 MATLAB 中的一个内置函数,用于返回当前正在执行的函数的输入参数个数。
if nargin < 5
disp('nargin<5')
Nd0 = 1; % Set your default value here
Na0 = 1;
T = 1;
Ef0 = 1;
Eg = 1;
else
disp('nargin=5')
Nd0 = Nd0;
Na0 = Na0;
T = T;
Ef0 = Ef0;
Eg = Eg;
end
end
或者:
function result = myFunction(a, b, c, d)
% 设置所有参数的默认值
if nargin < 1 || isempty(a)
a = defaultAValue;
end
if nargin < 2 || isempty(b)
b = defaultBValue;
end
if nargin < 3 || isempty(c)
c = defaultCValue;
end
if nargin < 4 || isempty(d)
d = defaultDValue;
end
% Rest of the function body
% 使用 a、b、c、d 进行计算
end
matlab代码编辑器中缩进的自动对齐
从matlab2007开始,matlab编辑器通过全选+ Ctrl+i
,可以对代码进行自动排版;
但初始设置有一个缺点:不能识别function,不会对function后的一行进行缩进——通过到matlab的英文论坛查询发现,可以通过设置使function后一行也能进行缩进。具体设置如下:
Preference->Editor/Debugger->Language->Function indenting format:Indent all functions(matlab2010b)
修改前:
<code>function f=mm
%This file is devoted to demonstrate the use of "for"
%and to create a simple matrix
for i=1:4
for j=1:4
a(i,j)=1/(i+j-1);
end
end
disp(a)
end
修改后:
function f=mm
%This file is devoted to demonstrate the use of "for"
%and to create a simple matrix
for i=1:4
for j=1:4
a(i,j)=1/(i+j-1);
end
end
disp(a)
end
【ref】matlab自动对齐
.mlx文件
:新建实时脚本
直接在mlx里写入:
Fermi_level_position_calculator_(1,1,1,1,1)
PETE_net_current_calculator_(1,1,1,1,1,1,1,1,1,1,1)
PETE_IV_plotter_
去掉mlx文件的单元格中绿色的箭头
解决方法:直接停止程序的运行
MATLAB的优势
工作区能直接展示丰富的数据统计
在python中使用matlab库
python import matlab
配置:在python环境中安装matlab库
目标:把matlab视为python的一个库,在python中<code>import matlab
方法:激活 python 环境,进入到指定路径:E:\CS\MATLAB R2022b(64bit)\MATLAB\R2022b\extern\engines\python
,然后执行:python -m pip install .
这样就可以 import matlab
了:
import matlab
print(matlab)
返回:
<module 'matlab' from 'e:\\CS\\Anaconda3\\envs\\ai38\\lib\\site-packages\\matlab\\__init__.py'>
【ref】安装用于 Python 的 MATLAB Engine API
debug
如果因为某种原因更新了matlab的目录,可能会发现找不到 ...R2022b\extern\engines\python
报错如下:
>>> import matlab
arch_file : F:\CS\Anaconda3\envs\physeg38\Lib\site-packages\matlab\engine\_arch.txt
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "F:\CS\Anaconda3\envs\physeg38\lib\site-packages\matlab\__init__.py", line 47, in <module>
add_dirs_to_path(bin_folder, engine_folder, extern_bin)
File "F:\CS\Anaconda3\envs\physeg38\lib\site-packages\matlab\__init__.py", line 19, in add_dirs_to_path
raise RuntimeError("Could not find directory: {0}".format(engine_dir))
RuntimeError: Could not find directory: F:\CS\Matlab_R2022a(64bit)\MATLAB\R2022b\extern\engines\python\dist\matlab\engine\win64
在 F:\CS\Anaconda3\envs\physeg38\lib\site-packages\matlab\__init__.py
里打印arch_file的路径:
arch_file = os.path.join(package_folder, 'engine', '_arch.txt')
print(f'arch_file : { arch_file}')
然后调用matlab
import matlab
得到arch_file的路径:
# arch_file : F:\CS\Anaconda3\envs\physeg38\Lib\site-packages\matlab\engine\_arch.txt
然后在arch_file里修改 ...R2022b\extern\engines\python\dist\matlab\engine\win64
的路径即可
在VSCode中调用matlab程序
方法一:在VSCode中安装Matlab插件
安装Matlab插件
为Matlab插件配置matlabroot的路径
在“此电脑”中配置环境路径
把代码文件夹加入MATLAB 路径中
<code>% 指定要添加到路径的根目录
rootFolder = 'D:\BaiduSyncdisk\PETE_cloud\PETE_SC_code\src';
% 生成包含所有子文件夹的路径列表
allFolders = genpath(rootFolder);
% 使用 addpath 将路径列表添加到 MATLAB 的搜索路径中
addpath(allFolders);
% 确认文件夹已经成功添加到路径中
disp(['文件夹 ' rootFolder ' 及其所有子文件夹已成功添加到 MATLAB 的路径中。']);
在VSCode中运行matlab
运行效果
方法二:在VSCode中安装Matlab Unofficial插件
安装 Matlab Unofficial 插件(而非MATLAB)
在 settings.json 下面输入下面这三行:
<code> "matlab.mlintpath":"E:\\CS\\MATLAB R2022b(64bit)\\MATLAB\\R2022b\\binwin64\\mlint.exe",
"matlab.matlabpath": "E:\\CS\\MATLAB R2022b(64bit)\\MATLAB\\R2022b\\binmatlab.exe",
"matlab.linterEncoding": "gb2312",
运行后,可以成功弹出窗口(但是:反应会慢半拍;每次都会弹出新的命令行窗口,不会覆盖旧的窗口)
优势互补
优势互补,效果最佳
在VSCode中写代码
快捷键和VSCode一致;
Ctrl+/
注释方便;
Shift+Alt+↓
快速复制某一行代码到下一行方便:
disp(['err_with_variant_T: ', num2str(err_with_variant_T)]);
disp(['left term: ', num2str(left_term)]);
disp(['left 1: ', num2str(P_sun)]);
disp(['left 2: ', num2str(J_rev*(phiB+2*Kb*TA))]);
disp(['right term: ', num2str(right_term)]);
disp(['right 1: ', num2str(P_IR)]);
disp(['right 2: ', num2str(P_0)]);
disp(['right 3: ', num2str(P_rad)]);
disp(['right 4: ', num2str(J_emm*(phiB+2*Kb*TC))]);
disp(['n q neq peq: ', num2str(n), ' ', num2str(q), ' ', num2str(neq), ' ', num2str(peq)]);
可Ctrl+左键
直接查看函数的定义;
可单击而非双击打开文件或文件;
在matlab中运行代码
可(无弹窗)直接在matlab界面中运行命令;
可直接查看所有函数的定义;
修改函数定义中的变量名时,可一键重命名所有变量;
MATLAB与科学计算
插值算法
griddedInterpolant 和 interp1
griddedInterpolant
和 interp1
是两种在 MATLAB 中进行插值操作的不同函数,它们的用法有所不同,具体如下:
%% griddedInterpolant方法(可运行)
x = 1:5;
y = 1:5;
y = y*10;
xi = 1.5;
F = griddedInterpolant(x, y);
result = F(xi);
disp(result)
%% interp1方法(可运行)
x = 1:5;
y = 1:5;
y = y*10;
xi = 1.5;
F = interp1(x, y, xi);
result = F;
disp(result)
%% interp1方法(不可运行)
x = 1:5;
y = 1:5;
y = y*10;
xi = 1.5;
F = interp1(x, y);
result = F(xi);
disp(result)
解一元方程
确定返回根的顺序
mathmatica的Solve和matlab的roots有什么不同?解一元方程时返回根的顺序是什么?
【mathmatica】
ff = x /. Solve[aa*x^3 + bb*x^2 - cc*x - dd == 0, x];
【matlab】
x = roots([aa, bb, -cc, -dd]);
在Mathematica的Solve函数中,根的顺序可能是根的任意排列,具体取决于内部算法。因此,在具体应用中,必须要亲自验证、确认结果的顺序是否符合需求(很多时候莫名其妙的虚数就是从这里算出来的)。
解微分方程
数值积分
MATLAB App案例
Mitometer App
【code】https://github.com/aelefebv/Mitometer
将pixal半径设置得过大,报错
警告: TIFF 库警告 - 'TIFFReadDirectory: Unknown field with tag 50838 (0xc696) encountered.'
警告: TIFF 库警告 - 'TIFFReadDirectory: Unknown field with tag 50839 (0xc697) encountered.'
警告: TIFF 库警告 - 'TIFFReadDirectory: Unknown field with tag 50838 (0xc696) encountered.'
警告: TIFF 库警告 - 'TIFFReadDirectory: Unknown field with tag 50839 (0xc697) encountered.'
数组索引必须为正整数或逻辑值。
出错 optimizeSigmaThresh (line 108)
threshOptimal = threshMatrix(floor(median(rowMin)));
出错 GUI2/Start2DButtonPushed (line 1098)
[app.sig,app.thr,costs] = optimizeSigmaThresh(ImBgRemoved);
错误使用 matlab.ui.control.internal.controller.ComponentController/executeUserCallback (line 382)
计算 Button PrivateButtonPushedFcn 时出错。
【ref】相同issue:Issue with pixel size
select highlighted 报错
函数或变量 'holdAllTemp' 无法识别。
出错 GUI2/SelecthighlightedButtonPushed (line 2014)
app.holdAll = holdAllTemp;
错误使用 matlab.ui.control.internal.controller.ComponentController/executeUserCallback (line 382)
计算 Button PrivateButtonPushedFcn 时出错。
【ref】相同issue:Segmentation and tracking completed but nothing shows
MATLAB Debug
Debug commands only allowed when stopped in debug mode.
问题:为什么一直说我在matlab里使用了Debug命令?明明没有
解决方法:重启matlab即可
警告: 将图例条目限制为 50 个。指定图形对象的向量以显示 50 个以上的条目。
plot时出现上述命令,可能是横坐标选错了,比如:
<code>plot(TC, Jemm-J_rev, 'LineWidth', 2, 'DisplayName', ['fixed n, xi = ', num2str(xi)]);
如果TC是一个数字,而不是一个列表,那么就可能会出现“图例数量爆炸”的情况
Matlab命令semilogy不起作用
原因:在使用semilogy命令之前不能使用 hold on 命令,hold on 命令要放到 semilogy 命令之后。
【ref】Matlab命令semilogy不起作用
文件被matlab占用时的删除方法
在命令行输入fclose all
,之后就可以删除该文件了
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。