MATLAB

出自 ArchWiki

本文或章节需要改进语言、wiki 语法或风格。请参考 Help:Style

原因: 过于冗长,有时以第一人称书写 (在 Talk:MATLAB 中讨论)

来自 官方网站

MATLAB 是一个编程和数值计算平台,数百万工程师和科学家使用它来分析数据、开发算法和创建模型。

安装

MATLAB 是 MathWorks 制作的专有软件,需要许可证才能获取、安装和激活。新版本的 MATLAB 每年发布两次,版本名称由 R、发布年份和 ab 组成。

Arch Linux 不在 官方支持的发行版列表中。

在安装 MATLAB 之前,必须先获得 MATLAB 软件的完整副本。拥有许可证的用户可以通过 DVD 和 MathWorks 网站获得 MATLAB 软件。除了软件之外,还需要文件安装密钥。

可以通过 MATLAB Package ManagermatlabAUR 或直接从 MATLAB 安装软件安装 MATLAB。推荐且最稳健的方法是使用 MATLAB Package Manager,因为它自动化了 MATLAB 和工具箱的安装。由于标准 MATLAB 安装程序不支持 Wayland,因此如果运行 Wayland,MPM 是安装 MATLAB 的唯一方法。请注意,MATLAB 本身需要 xorg-xwayland

使用 MATLAB Package Manager (MPM) 安装

MATLAB Package Manager (MPM) 提供了一种简化的方法,可以直接从命令行在 Linux 系统上安装 MATLAB 和随附的 MathWorks 产品。此实用程序有助于以编程方式进行安装,而无需用户登录、文件安装密钥或预先获得的许可证文件,从而将激活和许可推迟到安装后进行。MPM 允许指定 MATLAB 版本、其他工具箱和安装目录。此外,它非常适合构建 MATLAB Docker 容器。截至 2023 年,MATLAB 安装程序不支持 Wayland,这是通过命令行安装 MATLAB 的一种简便方法。

https://www.mathworks.com/mpm/glnxa64/mpm 下载 mpm 并使其成为 可执行文件

要将 MATLAB R2021b 以及选定的工具箱安装到指定目录,命令可能是例如

$ ./mpm install --release=R2021b --destination=/home/username/matlab MATLAB Simulink Deep_Learning_Toolbox Parallel_Computing_Toolbox

可以在 模板输入文件中找到格式正确的产品名称的完整列表。

从 MATLAB 安装软件安装

MATLAB 安装软件是独立的,不需要任何额外的软件包即可在静默模式下安装。要使用 GUI 安装,需要一个工作的 Xorg 图形显示。 Wayland 尚未正式支持,因此它将在 Xwayland 会话中运行。安装由 install 脚本处理。您可以以 root 身份运行脚本以系统范围安装 MATLAB,也可以以用户身份运行脚本仅为您安装。

在安装过程中,系统会询问您是否要创建符号链接。如果您没有选择这样做,您现在可以在 /usr/local/bin 中手动创建一个符号链接,以便更轻松地在终端中启动

# ln -s /{MATLAB}/bin/matlab /usr/local/bin

或者您可以将 MATLAB 安装路径添加到 PATH 环境变量中。

注意: 如果安装崩溃并显示 Failed to launch web window with error: Unable to launch the MATLABWindow application.,请参阅 #无法启动 MATLABWindow 应用程序 以获取解决方法。

桌面条目

可以选择创建一个 桌面条目。MATLAB 文件的 MIME 类型为 text/x-matlab

使用以下命令启动 matlab

  • -desktop 在没有终端的情况下运行 Matlab。
  • -nosplash 阻止启动画面显示。
  • -useStartupFolderPref 使用初始工作文件夹首选项指定的文件夹 [1]

为了使图标正确显示,需要在桌面条目中设置 StartupWMClass。要找出它,请启动 MATLAB,运行 xprop | grep WM_CLASS 并选择 MATLAB 窗口。

桌面条目示例

/usr/share/applications/matlab.desktop
[Desktop Entry]
Type=Application
Terminal=false
MimeType=text/x-matlab
Exec=/usr/local/MATLAB/R20xyz/bin/matlab -desktop -useStartupFolderPref
Name=MATLAB
Icon=matlab
Categories=Development;Math;Science
Comment=Scientific computing environment
StartupNotify=true

如果需要设置环境变量,可以在 Exec 中添加前缀 env,例如,用于系统的 libfreetype

Exec=env LD_PRELOAD=/usr/lib/libfreetype.so.6 matlab

可能需要使用系统的 libstdc++

在 Wayland 上运行

要使 MATLAB 在 Wayland 上运行,请设置 环境变量 QT_QPA_PLATFORM=xcb

从 AUR 软件包安装

matlabAUR 软件包旨在使 MATLAB 能够集成到 Arch 并由 Arch 管理。matlabAUR 软件包的优点在于它可以管理依赖项和安装过程中的一些细微之处。但请注意,该软件包不包含安装文件,您需要自己将它们放置在克隆的软件包文件夹中。使用 AUR 助手构建软件包可能会有问题,因此您需要手动执行此操作。您可以使用 MathWorks 网站上的安装程序获取实际的 MATLAB 软件。

警告: 专有 MATLAB 软件的 EULA 具有限制性,它禁止分发和修改安装文件。本节中描述的安装方法应仅在要安装软件的系统上执行,并且在安装后应从安装位置和 pacman 缓存中删除该软件包。重新分发构建的软件包违反了 MATLAB EULA。
  • 克隆 matlabAUR 软件包并 cd 进入它。
  • 从 MathWorks 下载包含 MATLAB 安装程序的 zip 文件到当前目录。
  • 使用以下命令运行解压后的安装程序
$ ./matlab/install
  • 安装程序让您选择立即安装软件或仅下载选定的模块。选择第二个选项。此选项也可能在“高级选项”下拉菜单下。
  • 安装程序将为您提供更改下载路径的选项。您可能需要将其更改为临时路径(例如 /tmp,如果您的内存盘足够大),因为您很快会将内容移动到不同的位置。
  • 等待下载完成并关闭安装程序。将下载的压缩包合并到解压后的 matlab 子目录中
$ rsync -a /selected/download/folder/YYYY_MM_DD_HH_MM_SS/ matlab
  • 然后将目录打包成 tarball
$ tar -cvf matlab.tar matlab
  • 下载您的许可证:转到 您的 MathWorks 帐户,然后单击您要使用的许可证号。然后,转到安装和激活选项卡,选择激活以检索许可证文件。按照说明操作并下载安装所需的许可证文件。将文件命名为 matlab.lic 并将其放置在 AUR 软件包目录中。MathWorks 网站上还会显示文件安装密钥 (FIK)。将其复制粘贴到一个名为 matlab.fik 的新文件中,并将其与 PKGBUILD 放在一起,就像您对 matlab.lic 所做的那样。
  • 现在,您将创建一个 pacman 软件包。您可以通过修改 PKGBUILD 来自定义您希望软件包包含的模块,或将其保留为默认值
PKGBUILD
...
# Limit products to lower size, set this to true to do a partial install
partialinstall=false
# Example list of products for a partial install; check README.md for details
products=(
  "MATLAB"
  #---MATLAB Product Family---#
  "Curve_Fitting_Toolbox"           # Math and Optimization
  "Database_Toolbox"              # Database Access and Reporting
  "Deep_Learning_HDL_Toolbox"
  "Deep_Learning_Toolbox"
  "DSP_System_Toolbox"
  "Global_Optimization_Toolbox"
  "GPU_Coder"
  "MATLAB_Coder"                # Code Generation
  "MATLAB_Compiler"               # Application Deployement
  "MATLAB_Compiler_SDK"
  "Optimization_Toolbox"
  "Parallel_Computing_Toolbox"        # Parallel computing
  "Partial_Differential_Equation_Toolbox"
  "Reinforcement_Learning_Toolbox"
  "Statistics_and_Machine_Learning_Toolbox"   # AI, Data Science, Statistics
  "Symbolic_Math_Toolbox"
  "Text_Analytics_Toolbox"
  #---Application Products---#
  "Audio_Toolbox"
  "Bioinformatics_Toolbox"          # Computational Biology
  "Computer_Vision_Toolbox"
  "Image_Processing_Toolbox"          # Image Processing and Computer Vision
  "Signal_Processing_Toolbox"         # Signal Processing
  "Wavelet_Toolbox"
)
...
  • 最后,使用 makepkg 命令构建和安装软件包
$ makepkg -sri

配置

Java

MATLAB 软件捆绑了 JVM,因此无需安装 Java。MATLAB 支持的 JVM 版本在 系统要求和平台可用性中列出,或者只需在 MATLAB 中键入 version -java 即可。可以设置 MATLAB_JAVA 环境变量以使用自定义 JVM,例如,指定 jre8-openjdk JRE,使用以下命令启动 MATLAB

$ env MATLAB_JAVA=/usr/lib/jvm/java-8-openjdk/jre matlab

OpenGL 加速

MATLAB 可以利用基于硬件的 2D 和 3D OpenGL 加速。硬件加速的支持需要在 MATLAB 外部配置。需要安装适当的 视频驱动程序以及 OpenGL 实用程序库 glu 软件包。如果使用 X11 转发,则需要在客户端和服务器上都安装视频驱动程序。要检查 MATLAB 是否正在使用基于硬件的 OpenGL 加速,请运行

$ matlab -nodesktop -nosplash -r "opengl info; exit" | grep Software

如果“software rendering”不是“false”,则您的硬件加速存在问题。如果是这种情况,请确保在系统上正确配置了 OpenGL。可以使用 mesa-utils 软件包中的 glxinfo 程序来完成此操作

$ glxinfo | grep "direct rendering"

如果“direct rendering”不是“yes”,则您的系统配置可能存在问题。

如果 glxinfo 工作正常但 matlab 不行,您可以尝试运行

$ export LD_PRELOAD=/usr/lib/libstdc++.so; export LD_LIBRARY_PATH=/usr/lib/xorg/modules/dri/; matlab -nodesktop -nosplash -r "opengl info; exit" | grep Software

如果它有效,您可以编辑 Matlab 启动器脚本以添加

export LD_PRELOAD=/usr/lib/libstdc++.so
export LD_LIBRARY_PATH=/usr/lib/dri/

进行这些更改后,您可能会在 MATLAB 控制台中看到低级图形错误,例如

com.jogamp.opengl.GLException: X11GLXDrawableFactory - Could not initialize shared resources for X11GraphicsDevice[type .x11, connection :0, unitID 0, handle 0x0, owner false, ResourceToolkitLock[obj 0x76ddc7cd, isOwner false, <6876ff80, 5d5c50dc>[count 0, qsz 0, owner <NULL>]]]
    at jogamp.opengl.x11.glx.X11GLXDrawableFactory$SharedResourceImplementation.createSharedResource(X11GLXDrawableFactory.java:326)
    at jogamp.opengl.SharedResourceRunner.run(SharedResourceRunner.java:297)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
    at jogamp.opengl.GLContextImpl.makeCurrent(GLContextImpl.java:688)
    at jogamp.opengl.GLContextImpl.makeCurrent(GLContextImpl.java:580)
    at jogamp.opengl.x11.glx.X11GLXDrawableFactory$SharedResourceImplementation.createSharedResource(X11GLXDrawableFactory.java:297)
    ... 2 more

在这种情况下,在 MATLAB 执行的目录(例如 /usr/local/MATLAB/R2020a/bin/glnxa64)中创建一个名为“java.opts”的文件,其中包含以下行

java.opts
-Djogl.disable.openglarbcontext=1

声音

要确认 MATLAB 能够使用默认声卡播放声音,请运行

$ matlab -nodesktop -nosplash -r "load handel; sound(y, Fs); pause(length(y)/Fs); exit" > /dev/null

这应该播放亨德尔的《哈利路亚合唱》的片段。如果失败,请确保正确配置了 ALSA。可以使用 alsa-utils 软件包中的 speaker-test 程序来完成此操作

$ speaker-test

如果您听不到任何声音,则您的系统配置可能存在问题。

GPU 计算

MATLAB 可以利用 支持 CUDA 的 GPU 来加速应用程序。为了利用受支持的 GPU,请安装 nvidianvidia-utilsocl-icdopencl-nvidiacuda 软件包。要检查 MATLAB 是否能够利用 GPU,请运行

$ matlab -nodesktop -nosplash -r "x=rand(10, 'single'); g=gpuArray(x); Success=isequal(gather(g), x), exit"  | sed -ne '/Success =/,$p'

安装受支持的编译器

为了访问 MATLAB 的全部功能(例如,使用 Simulink、Builder JA 和 MEX 文件编译),必须安装受支持版本的 gccg++gfortranjdk 编译器。有关 当前版本以前版本的受支持编译器的详细信息可在网上找到。过去 MATLAB 版本的许多受支持的 gccg++jdk 编译器版本都可以从 AUR 获得(例如,gcc43AURgcc44AURgcc47AURgcc49AURjdk7AUR),而过去版本的 gfortran 编译器未打包。

要将以前版本的 gccg++gfortran 编译器与 MEX 文件一起使用,请编辑 ${MATLAB}/bin/mexopts.sh 并将所有出现的 CC='gcc' 替换为 CC='gcc-4.X',将 CXX='g++' 替换为 CXX='g++-4.X',并将 FC='gfortran' 替换为 FC='gfortran-4.X',其中 X 是适合特定 MATLAB 版本的编译器版本。

注意
  • 较新版本的 Matlab(至少 2017a)似乎不遵循 ${MATLAB}/bin/mexopts.sh 自定义。而是使用 ${MATLAB}/bin/glnxa64/mexopts/LANG_glnxa64.xml 文件。
  • 虽然它不是官方支持的,但仍然可以使用更高版本的编译器,并忽略警告。

帮助浏览器

帮助浏览器在动态线程向量中使用了宝贵的插槽,并导致与 BLAS 等库提供的核心功能竞争,这些库也依赖于动态线程向量。可以使用以下命令将帮助浏览器配置为在动态线程向量中使用更少的插槽

>> webutils.htmlrenderer('basic');

这是一个持久性更改,要撤消它,请使用

>> webutils.htmlrenderer('default');

串口访问

为了成功连接到任何串口,MATLAB 希望直接写入 /var/lock,出于安全原因,Arch Linux 不允许这样做。您可以不为 MATLAB 允许此访问,而是通过使用 lockdev-redirectAUR 重定向设备锁定来解决此问题。您只需像这样执行 MATLAB 即可

# lockdev-redirect /{MATLAB}/bin/matlab

如果您创建了 .desktop 文件作为 MATLAB 的快捷方式,则将“lockdev-redirect”作为前缀添加到您的“Exec=”条目中。

HiDPI 和 4k

请参阅 HiDPI#MATLAB

故障排除

警告:初始化 MATLAB Graphics 失败

此错误似乎发生在多显示器设置中,请参阅 此论坛帖子

X11GLXDrawableFactory - 无法初始化 X11GraphicsDevice 的共享资源

在 matlab 可执行文件所在的文件夹中创建一个文件 java.opts

java.opts
-Djogl.disable.openglarbcontext=1

或查看 此论坛帖子 以获取其他解决方案

或禁用硬件加速

>> opengl('save','software')

帮助浏览器和 LiveScript 中出现黑屏

为了使用帮助浏览器和 LiveScript,请安装 libselinuxAUR

静态 TLS 错误

MATLAB 有许多库已使用静态线程本地存储 (TLS) 编译,包括帮助浏览器 doc 和 BLAS 库。例如,

>> doc('help');
>> ones(10)*randn(10);
Error using  * 
BLAS loading error:
dlopen: cannot load any more object with static TLS

与以下错误有关

  • 961964,MathWorks 从 MathWorks title="上次检查状态:404">[死链 2020-03-30 ⓘ] 提供了修补程序库
  • 1003952,存在解决方法

还建议使用重新编译 glibc 的更通用解决方案。 [2]

使用 WM(非重父窗口管理器)时出现空白/灰色 UI

请参阅 Java#灰色窗口、应用程序未随 WM 调整大小、菜单立即关闭

菜单和字段中文本和字体损坏

如果您注意到菜单或输入字段已损坏或未正确显示,则可以尝试激活 Matlab 首选项中的“使用抗锯齿平滑桌面字体”选项,这似乎可以解决问题。转到Preferences > Matlab > Fonts 并激活它。您需要重启 Matlab 才能生效。

缺少安装依赖项

Matlab 可能会抱怨找不到软件包。查看软件包名称并使用 Pacman 安装它,或者在 x86_64 的情况下,有些库仅在 AUR 中。matlabAUR 包含最新 Matlab 版本的最新依赖项列表。

另请参阅 #无法启动 MATLABWindow 应用程序

安装错误:archive 不是 ZIP 压缩包

在安装过程中,您可能会遇到

The following error was detected while installing package_name: archive is not a ZIP archive 
Would you like to retry installing package_name? If you press No, the installer will exit without completing the installation. More information can be found at /tmp/mathworks_root.log

Matlab 将所有软件包下载到 RAM 中的 /tmp/ 目录,该目录的最大大小为可用内存的一半。在这种情况下,它不足以容纳安装文件,Matlab 2019a 安装程序会警告您这一点。如果它没有警告,或者您忽略了警告,您将收到上述错误。

您可以 调整 tmpfs 大小(3.5 GB 不够,6 GB 可以),或者从基本安装中删除软件包,稍后使用内置的 Matlab 附加组件安装程序添加它们。

安装时库错误

  • 确保符号链接 bin/glnx64/libstdc++.so.6 指向正确版本的 libstdc++.so.xx(它也位于同一目录中,并且数字为 'xx')。默认情况下,它可能指向较旧(且不存在)的版本('xx' 的值不同)。
  • 确保您从中安装的设备未挂载为 noexec
  • 如果您从 Mathworks 网站下载了文件,请确保它们不在 NTFS 或 FAT 分区上,因为这会搞乱符号链接。Ext4 或 Ext3 应该可以正常工作。

使用 Intel 显卡时渲染或退出时卡顿

一些用户报告了在 Intel 显卡芯片上启用 DRI3 时出现的问题。一种可能的解决方法是禁用 DRI3 并在 DRI2 上使用硬件渲染运行 MATLAB;为此,请将环境变量 LIBGL_DRI3_DISABLE 设置为 1 来启动 MATLAB

LIBGL_DRI3_DISABLE=1 /{MATLAB}/bin/matlab

如果之前的解决方法不起作用,则可以通过使用 MATLAB 命令选择软件渲染来规避此问题(请注意,在执行大型或复杂的 3D 绘图时,性能可能非常差)

opengl('save','software')

有关更多信息,请参阅 [3][4]

LiveScript 错误

如果您在尝试加载或创建 LiveScript 时收到错误

 Viewing matlab live script files is not currently supported by this operating system configuration
  • 这可能是由于系统更新后,libgcrypt 和其他依赖项的符号链接损坏所致。在 Live Editor 首次启动时,组件被解压,并且创建了这些库符号链接(如果不存在)。
一种解决方案是简单地删除包含损坏的符号链接和解压组件的整个文件夹,该文件夹位于安装目录中
matlab_root/sys/jxbrowser-chromium
或者,如果安装目录不可由用户写入,则在
~/.matlab/R2017b/HtmlPanel
Matlab 将在下次 Live Editor 启动时重新生成内容。
更好的选择是将此解压目录中的 libgcrypt 符号链接替换为不太精确的链接。例如,解压后,将创建指向 /lib64/libgcrypt.so.20.2.4 的链接。将其替换为例如 /lib64/libgcrypt.so.20。
Matlab R2020 不再包含 chromium 目录。将库文件 libcrypto.so.1.1 与系统文件重新链接可以解决问题。它位于
matlab_root/bin/glnxa64
  • #无法启动 MATLABWindow 应用程序 中的步骤也可能解决此问题。
  • 这也可能是由于缺少 gconf 软件包而发生的。确保已安装 gconfAUR
  • 如果以上方法均无效,请在命令窗口中执行
>> com.mathworks.mde.liveeditor.widget.rtc.CachedLightweightBrowserFactory.createLightweightBrowser()

以获得更详细的错误消息。

  • 可以使用以下命令打开调试控制台
>> com.mathworks.mde.webbrowser.HtmlPanelDebugConsole.invoke;

使用网络摄像头/视频设备

确保安装了正确的支持软件包附加组件(例如,网络摄像头或 OS Generic Video Interface)。如果以用户身份运行 matlab,请确保您的用户对下载和安装支持软件包的任何位置具有写入权限。

自 MATLAB R2017a 起,Image Acqusition Toolbox 正在使用 GStreamer 库版本 1.0。它以前使用版本 0.10。

一般来说,USB Webcam Support Package 在使用 UVC 和内置摄像头方面比 OS Generic Video Interface Support Package 效果更好。

MATLAB 在关闭帮助浏览器时卡顿数分钟

本文或章节需要改进语言、wiki 语法或风格。请参考 Help:Style

原因: 以第一人称书写 (在 Talk:MATLAB 中讨论)

自 glibc 从 2.24 升级到 2.25 以来,MATLAB(至少 R2017a)在关闭帮助浏览器时会卡顿。此问题与 MATLAB 附带的特定版本的 jxbrowser-chromium 有关。glibc 2.26 以及 MATLAB R2017b 和 R2018a 中仍然存在此问题。

要解决此问题,请下载最新的 jxbrowser 并替换 MATLAB 中的以下 jar 文件

matlab_root/java/jarext/jxbrowser-chromium/jxbrowser-chromium.jar
matlab_root/java/jarext/jxbrowser-chromium/jxbrowser-linux64.jar

MATLAB 应该在首次打开帮助浏览器时自动将这些 jar 文件解压到 matlab_root/sys/jxbrowser-chromium/glnxa64/chromium 中。删除 matlab_root/sys/jxbrowser-chromium/glnxa64/chromium 目录以确保 MATLAB 使用最新的 jxbrowser。

不幸的是,此解决方法在 R2017b 中不再有效。深入研究此问题,它与 jxbrowser-chromium 进程之一的崩溃有关。然后 jxbrowser-chromium 的父进程坐在那里等待来自已死进程的响应。这会导致 MATLAB 主窗口冻结。您可以通过手动杀死所有剩余的 jxbrowser-chromium 进程来轻松解冻 MATLAB。

我想出了这个简单的脚本,它使用 inotify 并等待用户关闭 MATLAB 中的帮助浏览器。它在用户关闭帮助浏览器时触发,并向所有剩余的 jxbrowser-chromium 进程发送 kill 信号

#!/bin/sh

if [ -z "$1" ]; then
	REL=R2017b
else
	REL=$1
fi

JXPATH="/path/to/MATLAB/$REL/sys/jxbrowser-chromium/glnxa64/chromium"
CMD="inotifywait -m -e CLOSE $JXPATH/resources.pak"

#Exit if the daemon is already active
if ! pgrep -f "$CMD" > /dev/null; then
	#Wait for user to close Help Browser, then killall leftover jxbrowser processes
	$CMD |
	while read line
	do
		killall "$JXPATH/jxbrowser-chromium"
	done
else
	exit
fi

我将此脚本作为我的 MATLAB 启动脚本的一部分运行,如下所示

~/bin/unfreeze_matlab.sh R2017b &

为了确保当我退出 MATLAB 时此后台作业被杀死,我在 MATLAB 启动脚本的开头使用了以下代码

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT

某些下拉菜单无法选择

在某些界面中 - 例如 Simulation Data Inspector 或 Simulink Test Manager - 在下拉菜单中选择项目时没有任何反应(例如,在 Simulation Data Inspector 中尝试更改子图数量时)。要解决此问题,请在单击下拉菜单中的项目时按住 Shift 键。

无法启动 - 许可错误

如果 MATLAB 无法从 桌面环境通过调用其 桌面文件启动,则应查看从终端启动时的输出。

对于许可错误,例如

# matlab
MATLAB is selecting SOFTWARE OPENGL rendering.
License checkout failed.
License Manager Error -9
This error may occur when: 
-The hostid of this computer does not match the hostid in the license file. 
-A Designated Computer installation is in use by another user. 
If no other user is currently running MATLAB, you may need to activate.

Troubleshoot this issue by visiting: 
https://www.mathworks.com/support/lme/R2017a/9

Diagnostic Information:
Feature: MATLAB 
License path: /home/<USER>/.matlab/R2017a_licenses/license_<NUM>_R2017a.lic:/home/<USER>/.matlab/R2017a_licenses/lice
nse_Darkness_<NUM>_R2017a.lic:/opt/MATLAB/R2017a/licenses/license.dat:/opt/MATLAB/R2017a/licenses/*
.lic 
Licensing error: -9,57.

重新激活可能会解决问题。

/usr/local/MATLAB/R2017a/bin/activate_matlab.sh -javadir /usr/lib/jvm/java-8-openjdk/jre/

MATLAB 启动时崩溃,并显示“Failure loading desktop class”

如果 MATLAB 无法启动,并且从命令行启动时出现以下错误

$ matlab
Fatal Internal Error: Internal Error: Failure occurs during desktop startup. Details: Failure loading desktop class.

并且您的 _JAVA_OPTIONS 环境变量中设置了选项 -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel,请使用以下命令启动 MATLAB

$ _JAVA_OPTIONS= matlab

如果这有效,请添加以下行

export _JAVA_OPTIONS=

到您的 MATLAB 启动器脚本。可以选择重新添加其他 Java 选项。

无法在基于 MATLABWindow 的界面的文本字段中输入

本文或章节需要改进语言、wiki 语法或风格。请参考 Help:Style

原因: 以第一人称书写 (在 Talk:MATLAB 中讨论)

自 R2018a 以来,无法在基于 MATLABWindow 的界面(如 Signal Editor、Add-Ons Explorer 等)中输入文本。MATLABWindow 和 MATLAB 的 webwindow 基础设施基于 Chromium Embedded Framework,这看起来是一个已知且长期存在的错误:https://bitbucket.org/chromiumembedded/cef/issues/2026/multiple-major-keyboard-focus-issues-on

一种可能的解决方法是将焦点从 MATLABWindow 切换到另一个窗口,然后再切换回来 - 这样您就可以输入了。

为了更详细地说明此解决方法(因为 R2018b 中仍然存在此问题),这是我在我的 Openbox 配置中所做的(请注意,A-Middle 键绑定已经存在于默认配置中)

    <mousebind button="A-Middle" action="Press">
       <action name="Unfocus"/>
       <action name="Focus"/>
     </mousebind>

现在,每当无法在文本字段中输入时,我都会按 Alt+鼠标中键,然后我可以再次输入。

此问题在安装期间至关重要。单击安装窗口中的某些元素后,他将无法再在任何文本框中输入,并且在窗口之间切换并不总是有效。为了避免此问题,应仅使用按键操作,而不是在安装期间单击鼠标。MATLAB 安装程序对 Wayland 的支持较差,您也可以考虑在安装期间使用其他 WM。

无法启动 MATLABWindow 应用程序

在 MATLAB R2018b 到 R2022b 版本中,安装程序崩溃,如下所示

 $ ./install 
terminate called after throwing an instance of 'std::runtime_error'
  what():  Failed to launch web window with error: Unable to launch the MATLABWindow application. The exit code was: 127
[1]    1409378 IOT instruction (core dumped)  ./install

要找出 MATLABWindow 崩溃的原因,请手动运行它以获取详细信息。

 $ ./bin/glnxa64/MATLABWindow 
bin/glnxa64/MATLABWindow: symbol lookup error: /usr/lib/libcairo.so.2: undefined symbol: FT_Get_Color_Glyph_Layer

FT_Get_Color_Glyph_Layerfreetype2 的符号,这表明 MATLAB 应用程序与 Arch Linux 软件包之间存在库不兼容性。 [5]

要解决此问题,请将 MATLAB 的 libfreetype.so* 放在一边。

$ rm ./bin/glnxa64/libfreetype.so*

您还可以使用 LD_PRELOAD 环境变量强制 MATLAB 使用 Arch Linux 的 libfreetype,而无需删除 lib 文件。

$ export LD_PRELOAD=/lib64/libfreetype.so
$ ./install

同样,如果错误是由 undefined symbol: g_log_structured... 引起的,请将 MATLAB 的 libglib-2.0.so* 放在一边。如果错误是由 path to/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by _somelibrary_) 引起的,请将 MATLAB 的 libstdc++.so.6 放在一边。

安装期间无法验证大学登录信息

对于总人数许可用户,MATLAB 将弹出一个窗口,要求用户在网络浏览器中使用其凭据登录。但是,如果使用 sudo 运行,大多数浏览器(尤其是 Chromium)将无法运行。为了规避这个问题,用户应以普通用户身份通过浏览器访问 MATLAB 网站“激活计算机”。请参阅此问题

缺少 libcrypt.so.1

如果在启动或安装 MATLAB(R2020a 及更高版本)时遇到此错误,请安装 libxcrypt-compat

以 root 身份运行安装程序不会启动 GUI

如果您以 root 身份运行安装程序,但 GUI 没有出现(但在不以 root 身份启动的情况下出现),请尝试临时允许 root 用户访问 X Server,方法是按顺序运行以下命令(其中 ./install 是以 root 身份运行安装程序的命令)

$ xhost +SI:localuser:root
# ./install
$ xhost -SI:localuser:root

请注意,最后一个命令应在完成安装过程后执行,并且 localuser 是一个字符串字面量。请参阅 此支持解答,以及 xhost(1)

此外,请验证 DISPLAY 环境变量是否已设置。

另一种方法是以本地用户身份安装 MATLAB。

以用户身份安装时,GUI 安装程序无法创建目标文件夹

手动创建文件夹(以 root 身份),并获取所有权。路径通常为 /usr/local/MATLAB

# mkdir -p /path/to/MATLAB/R20XXx
# chown -R $LOGNAME: /path/to/MATLAB/R20XXx

MATLAB 在打开 Simulink 时崩溃

从终端运行时,错误消息为

Inconsistency detected by ld.so: ../elf/dl-tls.c: 597: _dl_allocate_tls_init: Assertion `listp != NULL' failed!

请在此处查看上游错误报告: https://www.mathworks.com/support/bugreports/details/2632298

MATLAB 无法打开或创建脚本文件

请参阅 #无法启动 MATLABWindow 应用程序

调用 mex 失败

如果从 MATLAB 或 Simulink 对 mex 的调用(例如快速加速器)失败,并出现错误 *.mexa64 is not a MEX file,即使生成的文件是可用的,也可能需要编辑 matlab/bin/~/.matlab7rc.sh 中,方法是将 LDPATH_PREFIX 变量从其默认空值更改: [6]

matlab/bin/.matlab7rc.sh (or ~/.matlab7rc.sh)
...
    case "$ARCH" in
	glnx*) #  Make sure you are modifying case glnx*
	    AUTOMOUNT_MAP=''
	    DISPLAY="$DISPLAY"
	    ARCH="$ARCH"
	    TOOLBOX="$TOOLBOX"
	    MATLABPATH="$MATLABPATH"
	    SHELL="$SHELL"
	    LDPATH_PREFIX='/usr/lib' 
...

与某些使用 MKL 的 Python 库不兼容

在 MATLAB 中运行的某些 Python 代码可能会失败,并出现提及 Parameter * was incorrect on entry to 的错误。可以通过调用以下命令来避免这种情况

py.sys.setdlopenflags(int32(bitor(int64(py.os.RTLD_NOW), int64(py.os.RTLD_DEEPBIND))));

py.sys.setdlopenflags(int32(bitor(int64(py.os.RTLD_LAZY), int64(py.os.RTLD_DEEPBIND))));

直接在任何调用 py 之前和调用 pyenv 之后。请参阅 此支持解答

设置在 MATLAB 重启后无法持久保存

在最近的 Arch 系统上的某些情况下,MATLAB 无法导出 .mlsettings 文件,从而阻止工具箱和某些 MATLAB 设置保存到磁盘并持久保存。这些情况源于 MATLAB 尝试将新文件从 /tmp 硬链接到首选项目录(通常是 ~/.matlab/release,其中 release 是 MATLAB 版本,例如 R2021b)。作为一种解决方法,请在设置 $TMPDIR 环境变量为与首选项目录位于同一文件系统上的文件夹的情况下运行 MATLAB。 [7]

“无法在当前系统配置中打开此文件”

可以通过移除 matlab_root/bin/glnxa64/ 中的 libfreetype.so.6 来修复此错误。您可以运行以下命令

cd matlab_root/bin/glnxa64/
mv libfreetype.so.6 libfreetype.so.6.old

工具条菜单中的符号未正确显示

此文章或章节需要扩充。

原因: 解释需要哪些符号,以便用户可以选择提供这些符号的任何字体。(在 Talk:MATLAB 中讨论)

可以通过安装 noto-fonts 来修复此问题。

Xwayland 上的空白屏幕

正如 Wayland#Java 中建议的那样,可以通过在 Matlab 启动器脚本中添加以下内容来修复此问题

export _JAVA_AWT_WM_NONREPARENTING=1

桌面错误,文本无法渲染

启动 MATLAB 时,您会收到一个错误对话框,其中消息为“desktop error”,并且文本无法渲染。错误日志如下所示

ERROR
Crash report:
Ajava.lang.ExceptionInInitializerError
at com.mathworks.mde.cmdwin.CmdWin.<init>(CmdWin.java:111)
at com.mathworks.mde.cmdwin.CmdWin.<clinit>(CmdWin.java:107)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at com.mathworks.jmi.ClassLoaderManager.loadClass(ClassLoaderManager.java:442)
at com.mathworks.jmi.ClassLoaderManager.findClass(ClassLoaderManager.java:422)
at com.mathworks.jmi.Matlab$2.findClass(Matlab.java:517)
at com.mathworks.util.ClassLoaderBridge.findClass(ClassLoaderBridge.java:23)
at com.mathworks.widgets.desk.DTClient.createComponent(DTClient.java:275)
at com.mathworks.widgets.desk.Desktop.createClientComponent(Desktop.java:6468)
at com.mathworks.mde.desk.MLDesktop.createClientComponent(MLDesktop.java:1040)
at com.mathworks.widgets.desk.Desktop.createClientComponentWrapper(Desktop.java:6482)
at com.mathworks.widgets.desk.Desktop.setClientShowing(Desktop.java:7181)
at com.mathworks.widgets.desk.Desktop.setClientShowing(Desktop.java:7168)
at com.mathworks.widgets.desk.DTNestingContainer$ViewState.restore(DTNestingContainer.java:2910)
at com.mathworks.widgets.desk.DTNestingContainer$SplitState.restore(DTNestingContainer.java:2536)
at com.mathworks.widgets.desk.DTNestingContainer$SplitState.restore(DTNestingContainer.java:2537)
at com.mathworks.widgets.desk.DTNestingContainer$RootState.restore(DTNestingContainer.java:2422)
at com.mathworks.widgets.desk.DTNestingContainer$RootState.restore(DTNestingContainer.java:2417)
at com.mathworks.widgets.desk.DTNestingContainer.restoreState(DTNestingContainer.java:2291)
at com.mathworks.widgets.desk.DTMultipleClientFrame.restoreState(DTMultipleClientFrame.java:2791)
at com.mathworks.widgets.desk.Desktop.restoreLayout(Desktop.java:5947)
at com.mathworks.mde.desk.MLDesktop.restoreLayout(MLDesktop.java:1652)
at com.mathworks.widgets.desk.Desktop.restoreLayout(Desktop.java:5706)
at com.mathworks.mde.desk.MLDesktop.setDefaultDesktop(MLDesktop.java:1539)
at com.mathworks.widgets.desk.Desktop.initMainFrame(Desktop.java:296)
at com.mathworks.mde.desk.MLDesktop.initMainFrameFromThread(MLDesktop.java:844)
at com.mathworks.mde.desk.MLDesktop.access$600(MLDesktop.java:224)
at com.mathworks.mde.desk.MLDesktop$Initializer.run(MLDesktop.java:1215)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Caused by: java.lang.ArithmeticException: / by zero
at com.mathworks.mde.cmdwin.XCmdWndView.getPotentialColumns(XCmdWndView.java:1072)
at com.mathworks.mde.cmdwin.XCmdWndView.setCWFont(XCmdWndView.java:1651)
at com.mathworks.mde.cmdwin.XCmdWndView.initPrefs(XCmdWndView.java:907)
at com.mathworks.mde.cmdwin.XCmdWndView.<init>(XCmdWndView.java:401)
at com.mathworks.mde.cmdwin.XCmdWndView.<clinit>(XCmdWndView.java:329)
... 43 more

此错误与缺少字体有关,可以通过从 AUR 安装 ttf-ms-fonts 软件包来修复

KDE 深色主题上的 Simulink 具有不适当的配色方案

当运行 Simulink 模块时,工作区窗口可能会渲染一些深色边框,导致在某些情况下角落的文本和图标完全不可见。根据 潜在的解决方案,可以通过使用以下命令设置 XDG_CURRENT_DESKTOPGTK_THEME 环境变量来修复它

export XDG_CURRENT_DESKTOP=GNOME
export GTK_THEME=Adwaita:light

终端中出现 canberra 消息

从终端启动 MATLAB 时,可能会收到如下所示的一行

Gtk-Message: 20:01:53.344: Failed to load module "canberra-gtk-module"

根据 [8],可以通过设置环境变量 GTK_PATH 来修复此问题。当然,需要安装 gtk2libcanberra 软件包。

env GTK_PATH=/usr/lib/gtk-2.0

R2024b 或更早版本的 MATLAB 出现 executable stack 错误

glibc 2.41 的最新版本也导致 MATLAB 出现问题。MATLAB 将抛出类似于以下的错误

$ bin/matlab
Command `service` threw an exception
Error loading /home/user/.MathWorks/ServiceHost/-mw_shared_installs/$version/bin/glnxa64/mathworksservicehost/rcf/matlabconnector/serviceprocess/rcf/service/libmwmshrcfservice.so. libmwfoundation_crash_handling.so: cannot enable executable stack as shared object requires: Invalid argument: Success: Success

更严格的安全设置现在要求为 libmwfoundation_crash_handling.so 共享对象文件禁用可执行堆栈权限。这可以使用 execstackAUR 来完成。

$ execstack -c ~/.MathWorks/ServiceHost/-mw_shared_installs/$version/bin/glnxa64/libmwfoundation_crash_handling.so

systemd-nspawn 中的 MATLAB

MATLAB 可以在 systemd-nspawn 容器中运行,以维护静态系统并避免在 Arch 中库进行重大更新后经常困扰 MATLAB 安装的库问题。有关设置此类容器的详细信息,请参阅 Systemd-nspawn

以下说明是在最小的 Debian 11 环境中运行 MATLAB R2021b 安装。它假设 MATLAB 已经正常安装在 "/usr/local/MATLAB/R2021b" 中。

使用 Xhost 允许 nspawn 环境使用现有的 X 服务器实例,另请参阅 Systemd-nspawn#使用 X 环境

在目录(此处为“deb11”)中创建一个最小的 Debian 环境,使用

$ debootstrap --include=systemd-container --components=main,contrib bullseye deb11

为 root 用户设置密码并创建普通用户

$ systemd-nspawn -D deb11
passwd
useradd -m username
logout

然后使用以下命令启动环境

$ systemd-nspawn --bind-ro=/dev/dri --bind-ro=/tmp/.X11-unix --bind=/dev/shm --bind=/usr/local/MATLAB --setenv=DISPLAY=:0 --setenv=MESA_LOADER_DRIVER_OVERRIDE=i965 -b -D deb11

安装以下软件包以在 nspawn 环境中拥有 MATLAB 所需的库: https://github.com/mathworks-ref-arch/container-images/blob/master/matlab-deps/r2021b/ubuntu20.04/Dockerfile

需要安装 "mesa-utils" 及其依赖项以支持图形加速。"usbutils" 可以安装以支持与 MATLAB 进行 I/O 的 usb 接口。

在环境中安装 matlab-support(来自 contrib 源)软件包以进行一些方便的集成。

$ apt-get install matlab-support

MATLAB 可以通过使用 matlab_root/bin 中的二进制文件,从环境内部正常启动。

另一种方法是将类似

-u username -a /usr/local/MATLAB/R2021b/bin/matlab -nosoftwareopengl -useStartupFolderPref

添加到上面的 systemd-nspawn 命令。