Matlab - 可选的句柄参数首先用于类似函数的绘图
Matlab - Optional handle argument first for plot like functions
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
我的问题是,我们可以使用什么技术来模拟这种行为?
您可以编写一个将 varargin
作为输入的函数。然后,您检查参数的数量。如果它小于 2
(或其他值,取决于您的函数),则抛出错误或警告。然后,检查输入参数的class
。
如果您的第一个输入的 class
是 'matlab.graphics.axis.Axes'
,那么您的函数应该调用:plot(ax,___)
。如果它是双精度数,那么它必须是 plot(X,Y,LineSpec)
格式。
按照这些思路应该可以工作
function [] = myplot(varargin)
if nargin < 2
error('Minimum two input must be given'); % You probably want something other than an error. This was just an example.
elseif nargin == 2
% Code for plotting
plot(x, y)
elseif nargin == 3
if strcmp(class(varargin{1}),'matlab.graphics.axis.Axes')
ax1 = varargin{1};
x = varargin{2};
y = varargin{3};
plot(ax1, x, y)
elseif isa(varargin{2}, 'double') && isa(varargin{3}, 'double') && isa(varargin{3}, 'char')
x = varargin{1};
y = varargin{2};
LineSpec = varargin{3};
else ...
PS!您不需要执行 x = varargin{1}
等操作,这只是为了说明如果 if
的计算结果为 true
,每个不同的单元格元素代表什么。
您可以继续"Name-Value Pair Arguments"。检查输入参数的 class 是否为 char
,并且它不能表示除参数名称以外的其他内容。如果它是一个参数名称,那么您就知道下一个参数是一个参数值。
我通常使用这样的模式,它也被 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
的更多信息。
首先,您可以通过键入 which axescheck
和 edit axescheck
查看 axescheck
的位置和源代码。通过这种方式,您可以确切地看到它的作用。
语法为[AX, ARGS, NARGS] = AXESCHECK(ARG1, ARG2, ...)
。
首先,它检查 ARG1
是否是轴的句柄。如果是,则返回为 AX
,其余参数 (ARG2, ...
) 在 ARGS
中返回,而 NARGS
是 nargin
的值减 1。
其次,它检查是否有任何输入参数是带有参数 Parent
的参数值对。如果是,则从列表中删除所有带有参数 Parent
的参数值对。 AX
返回指定轴,ARGS
返回剩余参数,NARGS
为nargin
减去参数个数的值。
如果以上两种方式都没有指定轴,则AX
为空,ARGS
只是输入参数,NARGS
是[=26的值=].
axescheck
适用于 class matlab.graphics.axis.Axes
.[=40 的旧式(Handle Graphics 1)双手柄和新式(Handle Graphics 2)手柄=]
它还会检查提供的句柄是否是已删除对象的句柄,如果是则抛出错误。
它在许多内置的 MATLAB 绘图函数中使用得相当广泛 - 例如,参见 hist.m, polar.m, surfl.m, bar3.m, comet.m, pie.m
和许多其他函数。
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
我的问题是,我们可以使用什么技术来模拟这种行为?
您可以编写一个将 varargin
作为输入的函数。然后,您检查参数的数量。如果它小于 2
(或其他值,取决于您的函数),则抛出错误或警告。然后,检查输入参数的class
。
如果您的第一个输入的 class
是 'matlab.graphics.axis.Axes'
,那么您的函数应该调用:plot(ax,___)
。如果它是双精度数,那么它必须是 plot(X,Y,LineSpec)
格式。
按照这些思路应该可以工作
function [] = myplot(varargin)
if nargin < 2
error('Minimum two input must be given'); % You probably want something other than an error. This was just an example.
elseif nargin == 2
% Code for plotting
plot(x, y)
elseif nargin == 3
if strcmp(class(varargin{1}),'matlab.graphics.axis.Axes')
ax1 = varargin{1};
x = varargin{2};
y = varargin{3};
plot(ax1, x, y)
elseif isa(varargin{2}, 'double') && isa(varargin{3}, 'double') && isa(varargin{3}, 'char')
x = varargin{1};
y = varargin{2};
LineSpec = varargin{3};
else ...
PS!您不需要执行 x = varargin{1}
等操作,这只是为了说明如果 if
的计算结果为 true
,每个不同的单元格元素代表什么。
您可以继续"Name-Value Pair Arguments"。检查输入参数的 class 是否为 char
,并且它不能表示除参数名称以外的其他内容。如果它是一个参数名称,那么您就知道下一个参数是一个参数值。
我通常使用这样的模式,它也被 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
的更多信息。
首先,您可以通过键入 which axescheck
和 edit axescheck
查看 axescheck
的位置和源代码。通过这种方式,您可以确切地看到它的作用。
语法为[AX, ARGS, NARGS] = AXESCHECK(ARG1, ARG2, ...)
。
首先,它检查 ARG1
是否是轴的句柄。如果是,则返回为 AX
,其余参数 (ARG2, ...
) 在 ARGS
中返回,而 NARGS
是 nargin
的值减 1。
其次,它检查是否有任何输入参数是带有参数 Parent
的参数值对。如果是,则从列表中删除所有带有参数 Parent
的参数值对。 AX
返回指定轴,ARGS
返回剩余参数,NARGS
为nargin
减去参数个数的值。
如果以上两种方式都没有指定轴,则AX
为空,ARGS
只是输入参数,NARGS
是[=26的值=].
axescheck
适用于 class matlab.graphics.axis.Axes
.[=40 的旧式(Handle Graphics 1)双手柄和新式(Handle Graphics 2)手柄=]
它还会检查提供的句柄是否是已删除对象的句柄,如果是则抛出错误。
它在许多内置的 MATLAB 绘图函数中使用得相当广泛 - 例如,参见 hist.m, polar.m, surfl.m, bar3.m, comet.m, pie.m
和许多其他函数。