我正在尋找一種將有限順序資料與 MATLAB 中的非確定性排序進行比較的方法。基本上,我想要的是一個陣列,但不對包含的元素施加順序。如果我有物品
a = [x y z];
和
b = [x z y];
我想isequal(a, b)回傳true。對于陣列,情況并非如此。簡單的解決方法是在比較條目之前對條目進行排序。不幸的是,在我的例子中,元素是復雜的物件,不能輕易地映射為彼此之間具有明確的數值關系。另一種方法是不使用isequal,而是使用自定義比較函式,它斷言匹配長度,然后簡單地檢查第一個陣列中的每個元素是否包含在第二個陣列中。但是,在我的情況下,陣列非常復雜地嵌套在我試圖比較的結構中isequal,并且為封裝結構撰寫自定義比較函式會非常復雜。除了這個排序問題,內置isequal函式涵蓋了我的所有需求,因為它可以正確處理具有任意欄位的任意嵌套結構,所以我真的很想避免為此撰寫復雜的自定義函式。
MATLAB 中是否有任何資料型別允許所描述的行為?或者有沒有辦法輕松構建這樣的自定義型別?在 Java 中,我可以簡單地為該方法撰寫一個帶有自定義實作的包裝類equals,但在 MATLAB 中似乎沒有這種機制?
uj5u.com熱心網友回復:
我找到了一種優雅地解決我的問題的方法。與我之前所說的相反,MATLAB 實際上確實允許特定于類的isequal.
classdef CustomType
properties
value
end
methods
function self = CustomType(value)
self.value = value;
end
function equal = isequal(self, other)
if not(isa(other, 'CustomType'))
equal = false;
return;
end
% implement custom comparison rules here
end
end
end
因此,我可以像這樣簡單地分配有問題的欄位,而不必更改代碼中的任何其他內容:
a = Set([x y z]); % custom type
...
b = Set([x z y]);
...
isequal(a, b); % true
在我的用例中,我什至不需要集合的唯一性屬性。所以我只需要執行與順序無關的比較,不需要浪費性能來確保不需要的屬性。此外,通過使用專用型別,我可以在分配時明確區分具有順序的欄位(即常規陣列)和沒有順序的欄位。
另一種解決方案可能是覆寫內置isequal并使其在其引數為特定型別時應用自定義比較規則。但是,這會減慢整個程式中的所有比較并導致封裝不良。我覺得使用帶有覆寫的自定義型別isequal是解決此類問題的方法。但我仍然認為集合(和其他型別的常用容器)應該包含在 MATLAB 的基本曲目中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/432375.html
上一篇:如何在dBFS中繪制PSD?
