簡體   English   中英

Matlab classdef中的“ __call__”等效項

[英]“__call__” equivalent in Matlab classdef

是否可以在MATLAB中定義類似於Python中的“ call ”方法的類方法?

您將如何在MATLAB中實現以下Python類。

class Basic(object):

    def __init__(self, basic):
        self.basic = basic

    def __call__(self, x, y):
        return (numpy.sin(y) *numpy.cos(x))

    def _calc(self, y, z):
        x = numpy.linspace(0, numpy.pi/2, 90)
        basic = self(x, y)
        return x[tuple(basic< b).index(False)]

要在MATLAB中創建“可調用”的類對象,您需要修改subsref方法。 當對對象A使用下標索引操作(例如A(i)A{i}Ai A(i)A{i}調用此方法。 由於在MATLAB中調用函數和為對象建立索引都使用() ,因此您必須修改此方法以模仿可調用行為。 具體來說,您可能希望定義()索引以顯示標量對象的可調用行為,但顯示非標量對象的法向矢量/矩陣索引。

這是一個示例 (使用此文檔定義subsref方法),將其屬性提升為可調用行為的冪:

classdef Callable

  properties
    Prop
  end

  methods

    % Constructor
    function obj = Callable(val)
      if nargin > 0
        obj.Prop = val;
      end
    end

    % Subsref method, modified to make scalar objects callable
    function varargout = subsref(obj, s)
      if strcmp(s(1).type, '()')
        if (numel(obj) == 1)
          % "__call__" equivalent: raise stored value to power of input
          varargout = {obj.Prop.^s(1).subs{1}};
        else
          % Use built-in subscripted reference for vectors/matrices
          varargout = {builtin('subsref', obj, s)};
        end
      else
        error('Not a valid indexing expression');
      end
    end

  end

end

這里是一些用法示例:

>> C = Callable(2)  % Initialize a scalar Callable object

C = 
  Callable with properties:
    Prop: 2

>> val = C(3)  % Invoke callable behavior

val =
     8         % 2^3

>> Cvec = [Callable(1) Callable(2) Callable(3)]  % Initialize a Callable vector

Cvec = 
  1×3 Callable array with properties:
    Prop

>> C = Cvec(3)  % Index the vector, returning a scalar object

C = 
  Callable with properties:
    Prop: 3

>> val = C(4)  % Invoke callable behavior

val =
    81         % 3^4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM