[英]“__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.