繁体   English   中英

如何在Matlab中重载find函数

[英]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 )

重载find()

如果您的对象方法将具有相似的语义,则可能应该只重载著名的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM