[英]How can I overload find function in Matlab
我可以在Matlab中重载find函数吗?
如您所知:ind = find(X)定位数组X的所有非零元素,并返回矢量ind中这些元素的线性索引。
但是,当X是对象数组时,如何使用find函数基于这些属性来查找元素?
正如Lucius Domitius Ahenobarbus在他给出的链接中指出的那样,在matlab中何时可以重载函数有严格的规则。
参加以下课程:
classdef myclass
methods
function find(self)
fprintf('find(myclass) has been called.\n');
end
end
end
并执行
X = [myclass myclass myclass]
find(X)
这给出以下输出:
X =
1x3 myclass with no properties.
Methods
find(myclass) has been called.
您在重载的find函数中所做的一切取决于您。 只需编写一个函数即可打印出与您所谓的“这些属性”相匹配的元素的索引,无论它是什么。
你可以在这里做两件事情:超载find
,或弹出你要搜索并拨打正规的条件find
这些。 在属性访问表达式上使用常规查找可能更有意义。
要将find
应用于对象或其他结构,您可以使用属性访问语法来创建逻辑表达式,以标识满足所需条件的对象,并将其传递给find
。 假设您的课程有一个qty
属性,那就是您要搜索的属性。
ind = find( [X.qty] ~= 0 );
您可以组合这些逻辑表达式来执行更复杂的搜索。
ind = find( [X.ghz] > 3 && [X.cacheMB] > 2 && [X.price] < 600 )
如果您的对象方法将具有相似的语义,则可能应该只重载著名的Matlab函数(例如find
。 find
函数采用逻辑数组并返回数字索引。 因此,只有在某种意义上该类的元素本身可以被视为零或非零值时,才对您的类有意义。
要重载要在您的类上使用的函数,只需在类中定义一个与该函数同名的方法即可。 为了与其他Matlab代码良好配合,除了允许对象的实例外,它可能还应接受与常规函数相同的典型参数。
假设您的类将二维空间中的点表示为(X,Y)坐标,并且您想将原点(0,0)上的点视为零,并将所有其他点视为非零。 您将提供一个find
方法来测试这两个点。 为了使行为与Matlab的find
一致,您可以仅在代码中实现非零测试,然后将其他所有内容传递给常规的find
函数。
class point
properties
X;
Y;
end
methods
function out = find(obj)
% Test for zero/nonzero points
x = reshape([obj.X], size(x));
y = reshape([obj.Y], size(y));
isNonzero = x + y; % Quantity is not meaningful, but covers zero/nonzero/NaN
out = find(isNonzero);
end
end
end
为了与find
完全一致,这有点复杂,因为find
支持附加的输入和输出参数,重载方法也应该如此。
class point
properties
X;
Y;
end
methods
function varargout = find(obj, varargin)
varargout = cell(1, max(nargout, 1));
% TODO: In production code, verify that varargin does not
% contain @point objects, to avoid infinite recursion
% Test for zero/nonzero points
x = reshape([obj.X], size(obj));
y = reshape([obj.Y], size(obj));
isNonzero = x + y; % Quantity is not meaningful, but covers zero/nonzero/NaN
[varargout{:}] = find(isNonzero, varargin{:});
end
end
end
所有这一切都是一种痛苦,因此,如果您需要对象的多态行为,则可能只想重载find
;也就是说,如果要将它们传递给编写用于在其输入上调用find()
其他代码。 如果仅在代码中需要本地find()
的输出,则进行属性访问可能会更容易。 或者,您可以只提供isnonzero()
方法以快速转换为find()
可以很好地使用的输入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.