【问题标题】:How properly overload size() method/operator in Matlab在 Matlab 中如何正确重载 size() 方法/运算符
【发布时间】:2015-07-23 08:27:23
【问题描述】:

我有一些带有属性 val 的类

classdef SomeClass < handle

properties
   val;
end
methods
    function sz = size(this,varargin)
        sz = builtin('size',this.val,varargin{:});
    end;
end
end

如果它被定义为矩阵,那么它应该是重载此方法以获得适当大小的类 SomeClass 对象的正确方法,即。 val 是一个矩阵。像这样的作业

a = size(b) % b is SomeClass object

不过有效

[a,b] = size(b)

没有。它会导致错误“输出参数过多。”,而内置的双精度方法大小(实际上是 val)使用此语法。

谁能给我一个提示。在这种情况下有什么问题?

【问题讨论】:

  • 方法size只需要两个参数,size(var, dim)。此外,您定义的方法只允许一个输出参数。尝试将varagout 用于可变输出参数。
  • @patrik 我完全同意varargout... 但是大小也可以采用 1 个参数:例如size(var) varargin 用法允许它仍然被调用
  • @RTL 你当然是对的。我只是认为由于{:},用户希望在varargin 中有多个变量。通常你可以有function varargout = size(this.val, dim), if nargin == 1, dim = 1; ...之类的东西,或者错误检查:if numel(varargin)&gt;1, error('errMsg')

标签: matlab size overloading operator-keyword


【解决方案1】:

正如 patrik 在 cmets 中提到的,使用 varargout...
加上nargout,size方法可以实现如下:

function varargout = size(this,varargin)
    [varargout{1:nargout}] = builtin('size',this.val,varargin{:});
end

作为旁注,由于 val 可能存在使用重载大小方法的类的极端情况,因此可以将内置函数的使用替换为直接调用 size

然而,这会带来更大的断裂风险,例如:

Obj = SomeClass();
Obj.val = Obj;
size(Obj);

会陷入无限循环...

【讨论】:

  • 谢谢,我尝试使用 varargout,但是以不同的方式,没有 [] 和 {},因此显然做错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2010-10-03
相关资源
最近更新 更多