linux · 2021年 2月 21日 0

matlab

Install matlab:

matlab 的安装有两种格式,一种是交互式的适合于图形界面,另外一种是静默是的。

图形界面

直接在命令行输入
liupei@hw1:~$./install
按提示正常操作即可

  • 在线激活
    输入用户名,密码登录激活
  • 离线激活
# 主机 ID , /sbin/ifconfig eth0
fa:16:3e:7f:53:f1
# 计算机登录名, whoami
liupei
  • 非正常激活
  1. 将 license_standalone.lic 放入Matlab安装目录的 licenses 文件夹中

sudo cp license_standalone.lic /usr/local/MATLAB/R2017b/licenses/

  1. 将 libmwservices.so 放入Matlab安装目录的 bin 中的 glnxa64 中

sudo cp libmwservices.so /usr/local/MATLAB/R2017b/bin/glnxa64/

可能出现的问题

  • install_unix: error while loading shared libraries and libexpat.so.1: file too short. 2020a.

unzip -X -K matlab_R2020a_glnxa64, 参考文献

  • 输入 ./install 后闪退
liupei@hw1:~$./install
Preparing installation files ...
Installing ...
Finish!

先尝试用 sudo chmod -R 777 <安装文件夹路径> 命令给整个安装文件夹授权后,再尝试安装, 确实可行。

静默安装

在SSH上远程安装采用第二种方式,参考文献,另一个参考,输入如下命令:

mkdir -p ~/installed/app/matlab/etc # 安装配置文件目录
mkdir -p ~/installed/app/matlab/R2019b # 安装位置
cd ~/installed/app/matlab/etc
cp serial/license.lic . //拷贝license
cp activate.ini . //拷贝激活文件模版供后续编辑
cp installer_input.txt . //拷贝自动安装文件模版供后续编辑
mv installer_input.txt installer_input_backup
grep -v "#" installer_input_backup >installer_input.txt
vim installer_input.txt
# installer_input.txt文件配置
destinationFolder=/public3/home/ch_cumtlp3/installed/app/matlab/R2019b
fileInstallationKey=09806-07443-53955-64350-21751-41297
agreeToLicense=yes
outputFile=/public3/home/ch_cumtlp3/installed/app/mathworks_cumtlp3.log
mode=silent
activationPropertiesFile=/public3/home/ch_cumtlp3/installed/app/matlab/etc/activate.ini
licensePath=/public3/home/ch_cumtlp3/installed/app/matlab/etc/license_standalone.lic
product.Computer_Vision_Toolbox
product.Control_System_Toolbox
product.Curve_Fitting_Toolbox
product.DSP_System_Toolbox
product.Deep_Learning_Toolbox
product.Econometrics_Toolbox
product.Image_Processing_Toolbox
product.Instrument_Control_Toolbox
product.MATLAB
product.Optimization_Toolbox
product.Parallel_Computing_Toolbox
product.Reinforcement_Learning_Toolbox
product.Signal_Processing_Toolbox
product.Statistics_and_Machine_Learning_Toolbox
product.Symbolic_Math_Toolbox    

# 配置 vim activate.ini
activateCommand=activateOffline
licenseFile=/public3/home/ch_cumtlp3/installed/app/matlab/etc/license_standalone.lic
activationKey=09806-07443-53955-64350-21751-41297

# 安装
cd ~/installed/matlab_R2019b_linuxISO/matlab2019b_linux
sudo ./install -inputFile /public3/home/ch_cumtlp3/installed/app/matlab/etc/installer_input.txt

matlab命令行安装

sudo ./install -mode silent -fileInstallationKey 09806-07443-53955-64350-21751-41297 -agreeToLicense yes -activationPropertiesFile activate.ini -destinationFolder /public3/home/ch_cumtlp3/installed/app/matlab2019b
口令: 
Preparing installation files ...
Installing ...
(三月 10, 2020 11:30:13) ##################################################################
(三月 10, 2020 11:30:13) #
(三月 10, 2020 11:30:13) # Today's Date: 
(三月 10, 2020 11:30:13) Tue Mar 10 11:30:12 CST 2020
(三月 10, 2020 11:30:13) 
(三月 10, 2020 11:30:13) System Info
(三月 10, 2020 11:30:13) OS: Linux 3.0.76-0.11-default
(三月 10, 2020 11:30:13) Arch: amd64
(三月 10, 2020 11:30:13) Data Model: 64
(三月 10, 2020 11:30:13) Language: zh
(三月 10, 2020 11:30:13) Java Vendor: Oracle Corporation
(三月 10, 2020 11:30:13) Java Home: /tmp/mathworks_23951/sys/java/jre/glnxa64/jre
(三月 10, 2020 11:30:13) Java Version: 1.8.0_202
(三月 10, 2020 11:30:13) Java VM Name: Java HotSpot(TM) 64-Bit Server VM
(三月 10, 2020 11:30:13) Java Class Path: /tmp/mathworks_23951/java/config/professionalinstaller/pathlist.jar
(三月 10, 2020 11:30:13) User Name: root
(三月 10, 2020 11:30:13) Current Directory: /tmp/mathworks_23951
(三月 10, 2020 11:30:13) Input arguments: 
(三月 10, 2020 11:30:13) root /public3/home/ch_cumtlp3/installed/matlab_R2019b_linuxISO/matlab2019b_linux
(三月 10, 2020 11:30:13) libdir /tmp/mathworks_23951
(三月 10, 2020 11:30:13) mode silent
(三月 10, 2020 11:30:13) fileInstallationKey 09806-07443-53955-64350-21751-41297
(三月 10, 2020 11:30:13) agreeToLicense yes
(三月 10, 2020 11:30:13) activationPropertiesFile activate.ini
(三月 10, 2020 11:30:13) destinationFolder /public3/home/ch_cumtlp3/installed/app/matlab2019b true
(三月 10, 2020 11:30:13) standalone true
(三月 10, 2020 11:30:18) Starting local product/component search in download directory
(三月 10, 2020 11:30:18) Searching for archives...
(三月 10, 2020 11:30:18) Reading /public3/home/ch_cumtlp3/installed/matlab_R2019b_linuxISO/matlab2019b_linux/archives
(三月 10, 2020 11:30:18) Extracting /public3/home/ch_cumtlp3/installed/matlab_R2019b_linuxISO/matlab2019b_linux/archives/platform_glnxa64.zip
(三月 10, 2020 11:30:18) Extracting /public3/home/ch_cumtlp3/installed/matlab_R2019b_linuxISO/matlab2019b_linux/archives/platform_common.zip
(三月 10, 2020 11:30:18) Reading /public3/home/ch_cumtlp3/installed/matlab_R2019b_linuxISO/matlab2019b_linux
(三月 10, 2020 11:30:18) 19 files found in /public3/home/ch_cumtlp3/installed/matlab_R2019b_linuxISO/matlab2019b_linux
(三月 10, 2020 11:30:18) Archive search complete.  21 total files found.
(三月 10, 2020 11:30:19) 正在提取设置
(三月 10, 2020 11:30:20) 正在汇集产品列表...
(三月 10, 2020 11:30:26) Completed local product/component search
(三月 10, 2020 11:30:26) Download thread pool size = 4
(三月 10, 2020 11:30:36) Installing Product: MATLAB Parallel Server
(三月 10, 2020 11:32:44) Installing Product: MATLAB
####################################
####################################
5. MATLAB Compiler SDK 要求安装以下程序: 

    ●  支持的编译器,用于创建 C 和 C++ 共享库
    ●  Java JDK,用于创建 Java 包

(三月 10, 2020 11:43:21) Exiting with status 0
(三月 10, 2020 11:43:21) End - Successful.
Finished

查看当前支持gblic版本的命令

愚蠢地删除libc.so.6

# 愚蠢地执行了sudo rm /lib64/libc.so.6 
strings /lib64/libc.so.6 | grep GLIBC
getconf -a |grep glibc -i
LD_PRELOAD=/lib64/libc-2.11.3.so  ln -s /lib64/libc-2.11.3.so /lib64/libc.so.6  
# or  export LD_PRELOAD=/lib64/libc-2.11.3.so
LD_PRELOAD=/usr/local/lib/libc-2.12.2.so  ln -s /usr/local/lib/libc-2.12.2.so /lib64/libc.so.6

学生版许可证

>> ver -support
-----------------
MATLAB 版本: 9.7.0.1216025 (R2019b) Update 1
MATLAB 许可证编号: STUDENT
操作系统: Microsoft Windows 10 Version 10.0 (Build 18362)
Java 版本: Java 1.8.0_202-b08 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode

MATLAB                                    版本 9.7(R2019b)      许可证 STUDENT
Simulink                                版本 10.0(R2019b)     许可证 STUDENT
Computer Vision Toolbox                    版本 9.1(R2019b)      许可证 STUDENT
Control System Toolbox                    版本 10.7(R2019b)     许可证 STUDENT
Curve Fitting Toolbox                    版本 3.5.10(R2019b)   许可证 STUDENT
DSP System Toolbox                        版本 9.9(R2019b)      许可证 STUDENT
Deep Learning Toolbox                    版本 13.0(R2019b)     许可证 STUDENT
Image Processing Toolbox                版本 11.0(R2019b)     许可证 STUDENT
Instrument Control Toolbox              版本 4.1(R2019b)      许可证 STUDENT
Optimization Toolbox                    版本 8.4(R2019b)      许可证 STUDENT
Parallel Computing Toolbox              版本 7.1(R2019b)      许可证 STUDENT
Reinforcement Learning Toolbox            版本 1.1(R2019b)      许可证 STUDENT
Signal Processing Toolbox                版本 8.3(R2019b)      许可证 STUDENT
Statistics and Machine Learning Toolbox 版本 11.6(R2019b)     许可证 STUDENT
Symbolic Math Toolbox                    版本 8.4(R2019b)      许可证 STUDENT
1MATLAB & 版本 9.7(R2019b)License 40875870
2Simulink & 版本 10.0(R2019b)License 40875870
3Computer Vision Toolbox& 版本 9.1(R2019b)License 40875870
4Control System Toolbox & 版本 10.7(R2019b)License 40875870
5Curve Fitting Toolbox & 版本 3.5.10(R2019b)License 40875870
6DSP System Toolbox & 版本 9.9(R2019b)License 40875870
7Deep Learning Toolbox & 版本 13.0(R2019b)License 40875870
8Econometrics Toolbox & Version 5.3 (R2019b)License 40875870
9Embedded Coder & Version 7.3(R2019b)License 40875870
10GPU Coder & Version 1.4(R2019b)License 40875870
Image Processing Toolbox& 版本 11.0(R2019b)License 40875870
Instrument Control Toolbox & 版本 4.1(R2019b)License 40875870
MATLAB Coder & Version 4.3(R2019b)License 40875870
MATLAB Compiler & Version 7.1(R2019b)License 40875870
MATLAB Compiler SDK & Version 6.7(R2019b)License 40875870
Optimization Toolbox & 版本 8.4(R2019b)License 40875870
Parallel Computing Toolbox & 版本 7.1(R2019b)License 40875870
Reinforcement Learning ToolboxLicense 40875870
Signal Processing Toolbox & 版本 8.3(R2019b)License 40875870
Statistics and Machine Learning ToolboxLicense 40875870
Symbolic Math Toolbox & 版本 8.4(R2019b)License 40875870
Wavelet Toolbox & Version 5.3(R2019b) & LicenseLicense 40875870

底层图形错误崩溃

警告: MATLAB 先前因底层图形错误而崩溃。为避免在此会话期间再次崩溃,MATLAB 将使用软件 OpenGL 而不再使用图形硬件。要保存该设置以供此后的会话使用,请使用 opengl(‘save’, ‘software’) 命令。

查阅 Matlab 帮助,发现matlab 里进行图形渲染的OpenGL实现,有三种方式(REF):

  • 硬件加速( hardware-accelerated)
  • 基本硬件加速(basic hardware-accelerated)
  • 软件实现(software )

默认情况下,matlab尝试使用硬件加速实现(若图形硬件支持)。当出现各类图形问题时,可以切换到软件实现或者基本硬件加速实现。但这些实现不支持一些高级图形特性。

  • 对于当前matlab有效(重启失效)
    (各种OpenGL实现切换方式为:opengl hardwarebasic, opengl software, opengl hardware). 将OpenGL实现改为基本软件加速,命令窗口键入 opengl hardwarebasic 并回车。再次查看OpenGL信息,检查matlab以何种实现,在matlab命令窗口键入 opengl info
  • 保存设置,对以后matlab启动均有效
    命令窗口输入: opengl(‘save’,’hardwarebasic’),重启matlab.

命令行运行m文件

  1. 如果*.m文件中不是函數,是一系列命令行,只需在命令行中輸入文件名,如a.m文件,输入 a 回車即可
  2. 如果*.m文件為function,如function scat = fun(image),那在workspace中直接調用 out = fun(image,aaa)
  3. 2019b以后费交互建议使用 -batch参数+

非交互方式执行 MATLAB 脚本或函数

-batch statement
示例:
matlab -batch "myscript"

matlab -batch "tic;disp(['hello ','world';'really ','good']);toc"

matlab -batch "addpath('../packageLiu/');demoFunc(910,'ccf','han4py.mat','roihan4py.mat')" >xx11.txt

tement 为 MATLAB 函数或脚本的名称,请不要指定文件扩展名。所需的任何文件都必须在 MATLAB 搜索路径上或在启动文件夹中。REF

请在非交互式脚本或命令行工作流中使用 -batch 选项。请勿将此选项与 -r 选项同时使用。

linux下中文注释乱码

中文注释乱码的原因是windows下的m文件采用的是gbk编码,只要将所有的m文件转成 utf8文件,显示就正常了。(在转成utf8前,别用matlab打开m文件,否则下面步骤完成后注释依旧有乱码,后果很严重…)

sudo apt install enca
cd code/
enca -x utf-8 a.m

修改字符编码utf-8 (utf8与gbk编码转换)

ncoding(encoding)
current = slCharacterEncoding()
# 'US-ASCII' | 'Windows-1252' | 'ISO-8859-1' | 'Shift_JIS' | 'UTF-8'

参考文献

输入进行检查和解析

matlab 进行输入检查和解析(REF

figure中文显示乱码

set(gca,'Fontname','Monospaced');

调节 matlab 显示语言:MATLAB菜单栏 > 预设 > 常规 > 选择桌面和错误信息的语言 > 英文。保存后重启MATLAB

matlab发邮件通知

针对问题:在远程工作站上运行耗时比较久的Matlab程序,总是要时不时的进去看程序有没有运行完,感觉时间严重的碎片化,于是编写代码让程序结束后自动发邮件通知。

运行完发信

function mailLDJ(subject,content,inboxAddress)
%发送邮件的代码
% subject:邮件主题
% content:邮件内容
% inboxAddress:收件箱
    MailAddress = 'XXX@163.com';    %替换为自己的邮箱
    password = 'G9rdX7G';  %替换为自己的密码或邮箱客户端授权码
    setpref('Internet','E_mail',MailAddress);
    setpref('Internet','SMTP_Server','smtp.163.com');%替换为自己邮箱的smtp服务器
    setpref('Internet','SMTP_Username',MailAddress);
    setpref('Internet','SMTP_Password',password);
    props = java.lang.System.getProperties;
    props.setProperty('mail.smtp.auth','true');
    sendmail( inboxAddress,subject,content);
end

为了方便,可以将这个文件放在Matlab的工作路径下,如果有安全的考虑,可以在Matlab的命令行窗口输入下面的命令来生成.p文件。最后在需要发送邮件的程序未尾添加以下命令,即可实现程序结束后发送邮件的命令

mailTome( 'Matlab程序运行结束',[mfilename,'已运行结束'],'YYY@qq.com' ) % YYY替换为自己要接收邮件的邮箱,mfilename可获得当前运行的m文件的名称

下面再编写一个函数文件来应对m文件运行出错的情况,文件名称为 Mailnotify.m,内容如下:

function Mailnotify( filename, inboxAddress  )
% Mailnotify( filename, inboxAddress )
% filename: 需要运行的m文件
% inboxAddress: 收件箱,可留空使用默认邮箱
    if nargin < 2
        inboxAddress = 'XXX@qq.com'; %默认邮箱,需替换为自己的邮箱
    end
    [~,cmdout] = system( 'systeminfo');
    tmp = regexp(cmdout,'\n');
    pc_name = cmdout( tmp(1):tmp(2) );  %获得电脑的主机名
    try
        % 由于Matlab中的run命令会使用到当前的工作空间,因此需要保存相应的变量,防止m文件中使用clear导致程序出错
        save tmp_Mailnotify.mat;    
        run( filename );
        load tmp_Mailnotify.mat;
        subject = [ filename, '运行结束' ];
        content = [ pc_name ];
    catch ME;
        load tmp_Mailnotify.mat;
        subject = [ filename, '运行出错!' ];
        content = [ ME.identifier,'  ', ME.message, pc_name ];
    end
    % 删除之前储存的变量
    delete tmp_Mailnotify.mat
    mailLDJ(subject,content,inboxAddress ); 
end

将 Mailnotify.m 放在Matlab的工作目录下,然后在Matlab命令窗口中输入下面的命令即可

Mailnotify( 'test.m' )  %test.m为需要运行的m文件

REF1REF2

eval错误

matlab出现错误使用eval的提示的解决办法

>> restoredefaultpath
>> rehash toolboxcache
>> savepath

matlab并行计算

并行编程需要依托一些并行技术来实现。没有这些技术的话,那么编写的代码就是串行的单核代码

tic
    t = datevec(datestr(now));
    if (t(1)<=2020 && t(2)>5)
        disp('expired,contact with liupei@hpu.edu.cn')
        exit
    end
    disp(datetime('now'))
% 
cpu_core = 4;
c = parcluster();
c.NumWorkers = cpu_core;
job = createJob(c);
% 
a_scan = 0:1:100;
for i = 1:length(a_scan)
    a = a_scan(i);
    parameter = {a};
    t = createTask(job,@myCode,1,parameter);
end
% 
submit(job);
wait(job);
output = fetchOutputs(job);
save("myData.mat","output")
% 
toc

% 程序封装为函数
function c = myCode(a)
  for i=1:1000
    c = a+i;
  end
end

这里的并行计算实际上可以分为三部分,REF

  1. 创建集群,并在集群上创建job
    第一部分不需要作太多改动,只要改动你需要的核心数cpu_core
  2. 根据自己的情况根据参数依次分配任务
    第二部分则需要作出改动,但是思路已经全部告诉各位了
  3. 提交任务
    第三部分不需要改动(当然你可以改动保存的文件名称)

并行改串行计算

tic
t = datevec(datestr(now));
if (t(1)<=2020 && t(2)>5)
    disp('expired,contact with liupei@hpu.edu.cn')
    exit
end
disp(datetime('now'))
% 
a_scan = 0:1:100;
c = cell(1,length(a_scan));
for i = 1:length(a_scan)
    a = a_scan(i);
    c{i} = myCode(a);
end

save('myDataCascade.mat','c')
% 
toc

coder与compiler

  1. System Requirements and Supported Compilers. ref
  2. matlab compiler
    直接将m文件生成为①exe文件,② 动态链接库dll文件,③COM组件,且这样的代码在运行或者调用时需要matlab compiler runtime库支持。
    命令行:mcc
    图形界面:deployment
  3. matlab coder
    将matlab m文件转换成① c/c++文件;② exe文件;③动态链接库dll文件;④ mex文件,更可以根据需要将c/c++文件进一步转换成exe和lib文件,无需MCR支持。
    命令行:coder
    图形界面:codegen
  4. mex命令
    通过生成mex文件,将C++快速集成到 matlab 环境,第一次使用需要进行配置 >>mex – setup ,常用命令还有 >>mexext 查询当前平台的 MEX 扩展名
  5. mbuild 命令
    是 matlab 环境下的一个集成工具,通过 mbuild 可以在 matlab 环境下将 C/C++编译为 可执行文件或动态链接库等目标文件。实际上是通过调用 C/C++ 编译器完成编译。第一次使用需要配置环境 >> mbuild – setup

Cannot write to preference file “matlab.prf”

I installed MATLAB on ubuntu in some othe folder than the root folder, and successfully installed it with “sudo apt install matlab-support”.

Executed this command on the terminal, Ref.

sudo chown -R USER /home/USER/.matlab/R2018b/ 

matlab版本与产品分类

  • matlab到底能干什么,ref
  • 版本与系统支持,ref
  • 产品分类,ref

常用代码

限时发布

t=now;
warnMsg = {'软件过期,请联系作者!';'刘培-博士';'Email:';'cumtlp@qq.com'};
if t>7371567 %改时间由上一句得到的 2016/9/1 22:00
% if t>366934
msgbox(warnMsg,'友情提示','warn');
close(gcf)
end

matlab时间,matlab系统时间等,参考文献

% datestr(now)以字符串形式返回当前日期和时间
datestr(now)
  ans =
  29-Dec-2018 21:36:33
% 返回表示当前日期和时间的datetime标量,输入:
t = datetime('now')
t = 
   2018-12-29 21:37:52
% 具体时间转为数组,代码如下:
time_1=datevec(datestr(now))
time_1 =
        2018 12 29 21 23 23
time_1(1),time_1(2)
   ans =
        2018
   ans =
    12

t = datevec(datestr(now));
if (t(1)<=2020 && t(2)>5)
   disp(t(1))
   disp(t(2))
   disp('time expired,contact with liupei@hpu.edu.cn')
exit
end
disp(datetime('now'))

换所有等于某个值

若非NaN:
a=[2,5;1,4;1,4;3,6;3,6;2,5];
a(a==1)=0; %所有1替换为0
% 上述方法可以把数替换为NaN但不能把NaN替换为数

若为NaN
a(isnan(a))=0; %将NaN替换为0

MATLAB设置搜索路径

  • 在命令窗口运行 pathtool 命令
  • 利用path命令设置搜索路径
    path (path, ‘新增目录’) %在MATLAB的搜索路径的末尾添加新目录
    >> path(path,'c: :\MyDir ')

slurm运行matlab

slurm脚本模板为 matlab_job.slurm :

#SBATCH -o test.std_%j.out
#SBATCH -J test
#SBATCH -e test.error.out
#SBATCH -P inter -N 1 -n 4

module load matlab/R2016b

# matlab -nodisplay -nosplash -nojvm -r script
matlab -nodisplay < matlab_parfor.m
  • 切记在要运行的 .m 文件的结尾加入 quit,否则在任务结束后无法释放节点。
  • 将脚本于要治疗性的 .m 文件放在同一个文件夹下,运行 sbatch matlab_job.slurm
  • 参数 -r 厚么紧跟索要运行的 .m 文件的文件夹名!不要写后缀~~~!!!

参考文献cluster, chicago

TOC