gpt4 book ai didi

python - "__call__"等价于 Matlab classdef

转载 作者:行者123 更新时间:2023-12-01 02:32:53 26 4
gpt4 key购买 nike

是否可以在 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 中创建一个类对象 "callable" ,您需要修改 subsref方法。这是当您对对象使用 A(i)A{i}A.i 等下标索引操作时调用的方法 A。由于在 MATLAB 中调用函数和索引对象都使用 (),因此您必须修改此方法以模仿可调用行为。具体来说,您可能希望定义 () 索引来展示 scalar obect 的可调用行为。 ,但展示非标量对象的法线向量/矩阵索引。

这是一个示例 class (使用 this documentation 定义 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

关于python - "__call__"等价于 Matlab classdef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46596602/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com