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