matlab2tikz 用于冲浪图:减少数据?

matlab2tikz 用于冲浪图:减少数据?

我很高兴看到 matlab2tikz 也支持 surf 图。不幸的是,它产生的数据太多,所以我遇到了众所周知的内存问题。我尝试使用 lualatex 而不是 pdflatex 进行编译,但出现了类似这样的错误

软件包 pgfkeys 错误:我不知道密钥“/tikz/axis lines*”,我将忽略它。也许您拼错了。

由于我之前从未使用过 lualatex,所以目前我还没有进行进一步的尝试,但我愿意接受建议。

然后,我找到了 matlab2tikz 的选项“minimumPointsDistance”。这对于普通图非常有用,但对于冲浪图似乎没有效果。

然后我尝试了 tikzpicture 中的“每个第 n 个点”选项。使用每十分之一点进行编译是可以的,但不会生成可接受的图。7 更好,但仍然远远不够,6 给我带来了旧的内存问题。

我尝试在 MatLab 中绘制每个方向仅一半点的图形,但这看起来比“每个第 n 个点 = {10}”更糟糕。

这何必这么复杂?这只是 100 x 100 个点的测试运行!

不过,仍有优化空间。我的图的很大一部分接近于零,所以最好剔除其中的一些。有趣的部分似乎对遗漏点非常敏感,所以我更喜欢一个可以使用整个输出的解决方案。

我知道,我总是可以生成一个 eps 文件并将其转换为 pdf。它看起来不错,特别是如果我axis off在 MatLab 中设置的话。但我不知道如何使用 tikz 重新创建它们...

我现在真的没有选择了,迫切希望得到任何形式的帮助或建议!

答案1

错误/tikz/axis lines*表明您的 pgfplots 版本非常旧(并matlab2tikz使用pgfplots)。我预计 pdflatex 和 lualatex 都会出现同样的问题。我猜您的版本甚至可能比 1.3 版还旧。在这种情况下,它可能根本不支持 3d 轴?

我认为你可以选择以下方式进行:

  1. 通过 matlab 对数据进行下采样。使用一半的点可能太多了,请参阅 matlab 中的 interp2。

  2. 使用较新版本的 pgfplots 和 lualatex 重试。请参阅下面的示例。

  3. 阅读 pgfplots 手册中的“外部三维图形和 Matlab”(如果您有最新版本!)。该部分包含 Jake 在pgfplots 中的三维直方图它可以轻松创建 MATLAB 图像的 PNG 图像和 pgfplots 轴。

如果您想遵循(2),以下是我为自定义示例获得的内容:

\documentclass{standalone}

\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
\begin{axis}[
    title=$120 \times 120$ Smooth Surface,
    xlabel=$x$,
    ylabel=$y$]
\addplot3[surf,samples=120,shader=interp,domain=0:1]
    {sin(deg(8*pi*x))* exp(-20*(y-0.5)^2)
    + exp(-(x-0.5)^2*30
        - (y-0.25)^2 - (x-0.5)*(y-0.25))};
\end{axis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

120x120 的网格产生了一个 130kb 的 pdf 文件,并花了 2 分钟在我的系统上通过 lualatex 运行。

如果编译时间要求和大小限制对您来说都是可以接受的,那么您应该确保使用lualatexmatlab2tikz生成输出\addplot3[...., surf, shader=interp,...]并运行它。否则,您应该重新考虑 (1.) 或 (3.)。但是,通过 lualatex 运行它应该会相当好,特别是如果您确保避免不必要的连续重新编译(请参阅外部库或独立)。

相关内容