Matlab subsref和end

Matlab subsref和end,matlab,operator-overloading,Matlab,Operator Overloading,我有一个自定义矩阵类,我希望能够将其索引为: x = myobj(1,2).d(3,4) % myobj(1,2,3,4) x = myobj(2, 3).d(3, end) % myobj(1,3,1,end) 我希望这些也能完成任务 我从以下几点开始: class MyClass < double methods function obj = MyClass(x) obj = obj@double(x); end function ob

我有一个自定义矩阵类,我希望能够将其索引为:

x = myobj(1,2).d(3,4)     % myobj(1,2,3,4)
x = myobj(2, 3).d(3, end) % myobj(1,3,1,end)
我希望这些也能完成任务

我从以下几点开始:

class MyClass < double
  methods
    function obj = MyClass(x)
      obj = obj@double(x);
    end
    function obj = subsref(obj, s)
      varargout{:} = subsref@double(obj, subsintercept(obj, s));
    end
    function obj = subsasgn(obj, s, b)
      obj = subsasgn@double(obj, subsintercept(obj, s), b);
    end
  end
end
我得到了这种预期的行为

>> myobj = MyClass(zeros(1,2,3,4))
>> myobj(1,2).d(3,4)
subsintercept
type: '()'
subs: {[1]  [2]}
type: '.'
subs: 'd'
type: '()'
subs: {[3]  [4]}
<error due to not having finished subsintercept yet>
>myobj=MyClass(零(1,2,3,4))
>>myobj(1,2).d(3,4)
副业
类型:“()”
subs:{[1][2]}
类型:'.'
潜艇:“d”
类型:“()”
subs:{[3][4]}
但这出乎意料

>> myobj(1,2).d(3,end)
subsintercept
type: '()'
subs: {[1]  [2]}
type: '.'
subs: 'd'
<error due to not having finished subsintercept yet>
>myobj(1,2).d(3,end)
副业
类型:“()”
subs:{[1][2]}
类型:'.'
潜艇:“d”
  • 为什么添加
    end
    会导致我没有收到
    3
  • 这种行为有记录吗

  • 一些测试表明:

    result = myobj(1,2).d(3,end)
    
    翻译为:

    end_ = str2func('end');
    d_temp = subsref(myobj, substruct('()', {1 2}, '.', 'd'));
    ei = end_(d_temp, 2, 2);
    result = subsref(myobj, substruct('()', {1 2}, '.', 'd', '()', {3, ei}));
    
    i、 例如,
    subsref
    被调用两次*


    *令人惊讶的是,在第二次测试中,并不是像subsref(d_temp,substruct(“()”,{3,ei}))那样

    result = myobj(1,2).d(3,end)
    
    翻译为:

    end_ = str2func('end');
    d_temp = subsref(myobj, substruct('()', {1 2}, '.', 'd'));
    ei = end_(d_temp, 2, 2);
    result = subsref(myobj, substruct('()', {1 2}, '.', 'd', '()', {3, ei}));
    
    i、 例如,
    subsref
    被调用两次*


    *令人惊讶的是,第二次
    subsref(d_temp,substruct(“()”,{3,ei}))
    d
    是动态属性还是什么?@Suever:
    d
    不存在。该类是
    double
    的子类。除了一个无趣的构造函数之外,没有其他属性或方法。我现在已经为所有这些添加了样板,但我认为它阻碍了清晰性,因为
    d
    不存在,MATLAB无法将
    end
    转换为任何有用的东西。你希望
    end
    产生什么结果?@Suever:我希望我能通过某种
    end
    对象。你能提供一些关于你的类的更多信息吗。
    d
    是动态属性还是什么?@Suever:
    d
    不存在。该类是
    double
    的子类。除了一个无趣的构造函数之外,没有其他属性或方法。我现在已经为所有这些添加了样板,但我认为它阻碍了清晰性,因为
    d
    不存在,MATLAB无法将
    end
    转换为任何有用的东西。你希望
    end
    产生什么结果?@Suever:我希望我能通过某种
    end
    对象我想这是有意义的,因为
    myobj(1,2).d
    需要先解决,然后才能决定如何处理
    end
    。也许值得对其进行一些充实,以使其更清楚地说明如何编写
    subsref
    来处理此问题。@suever:我会在着手实现它时这样做。似乎我在
    d
    中需要某种类型的代理对象,我想这是有意义的,因为
    myobj(1,2)。d
    需要先解析,然后才能确定如何处理
    结束。也许值得对其进行一些充实,以使其更清楚地说明如何编写
    subsref
    来处理此问题。@suever:我会在着手实现它时这样做。似乎我需要
    d