簡體   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