Matlab - 可选的句柄参数首先用于类似函数的绘图

标签 matlab plot optional-arguments

Matlab 包含许多绘图函数,这些函数采用可选参数作为要绘制到的轴的句柄。网上有很多向用户定义函数(varargin、inputParser)添加可选参数的解决方案,但是它们通常要求可选参数仅出现在强制参数之后,而 matlab 中的绘图函数通常采用以下形式

plot(optional, mandatory, optional)

也就是说,可选参数可以出现在强制参数之前和之后。

我想为自定义绘图类型复制此行为,以便它遵循与内置绘图函数相同的样式。提供了以下用例来证明仅检查参数的数量不足以实现所需的行为:

x = [1:10];
y = x.^2;
ax(1) = subplot(1, 2, 1);
ax(2) = subplot(1, 2, 2);

myplot(x, y);                 %Mandatory
myplot(x, y, 'r+');           %Mandatory, optional
myplot(ax(1), x, y);          %Optional, mandatory
myplot(ax(2), x, y, 'r+');    %Optional, mandatory, optional

我的问题是,我们可以使用哪些技术来模拟这种行为?

最佳答案

我通常使用这样的模式,它也被 MATLAB 中的许多绘图函数使用:

function varargout = myplot(obj, varargin)

    % Check the number of output arguments.
    nargoutchk(0,1);

    % Parse possible axes input.
    [ax, args, ~] = axescheck(varargin{:}); %#ok<ASGLU>

    % Get handle to either the requested or a new axis.
    if isempty(ax)
        hax = gca;
    else
        hax = ax;
    end

    % At this point, hax refers either to a specified axis, or
    % to a fresh one if none was specified. args refers to the
    % remainder of any arguments passed in varargin.

    % Parse the rest of args

    % Make the plot in hax

    % Output a handle to the axes if requested.
    if nargout == 1
        varargout{1} = hax;
    end  

end

axescheck是一个未记录的函数。这样做总是冒着很小的风险,但它在 MATLAB 中一直存在并且一直没有改变,而且它被 MATLAB 中许多非常稳定的绘图函数使用,所以你应该没问题。

它的作用是检查第一个参数是否是轴的句柄。如果是,则 ax是那个句柄,args是其余的输入参数。如果没有,那么 ax是空的 args包含所有输入参数。

希望对您有所帮助!


编辑:关于 axescheck 的更多信息根据要求。

首先,您可以看到axescheck 的位置和源代码。通过输入 which axescheckedit axescheck .通过这种方式,您可以准确地看到它的作用。

语法是[AX, ARGS, NARGS] = AXESCHECK(ARG1, ARG2, ...) .

首先,它检查是否 ARG1是轴的句柄。如果是,则返回为 AX , 其余参数 ( ARG2, ... ) 在 ARGS 中返回, 和 NARGSnargin 的值减 1。

其次,它检查是否有任何输入参数是带有参数 Parent 的参数值对.如果是,则所有参数值对都带有参数 Parent从列表中删除。在 AX 中返回指定的轴,其余参数在 ARGS 中返回, 和 NARGSnargin 的值减去已删除参数的数量。

如果以上两种方式都没有指定轴,则AX是空的,ARGS只是输入参数,NARGSnargin 的值.

axescheck适用于 matlab.graphics.axis.Axes 类的旧式(Handle Graphics 1)双 handle 和新型(Handle Graphics 2) handle .

它还会检查提供的句柄是否是已删除对象的句柄,如果是则抛出错误。

它在许多内置的 MATLAB 绘图函数中得到广泛使用 - 例如,请参见 hist.m, polar.m, surfl.m, bar3.m, comet.m, pie.m和许多其他人。

关于Matlab - 可选的句柄参数首先用于类似函数的绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39365970/

相关文章:

string - 这两种 MATLAB 字符串连接方法哪一种更快?

c - 关于命名管道的简短阅读(matlab->linux)

python - MAP@k计算

javascript - 覆盖默认值

vba - (Excel) 带有可选参数的 vba 程序将无法启动

python - Numpy 1-dim 数组与 2-dim 数组,其中一个维度的长度为 1

r - 条形图 : Bar width based on time - R

matlab - 如何在 MATLAB 中绘制水平线和垂直线?

plot.window(...) 中的 R 错误需要有限的 'xlim' 值

python - 如何指示函数应该使用可选参数的默认值而不省略它?