實現對用戶的M代碼的複雜數據排序可能將是在性能方面損失,由於M-級操作的開銷相比,Matlab的內置命令。嘗試用Matlab現有的矢量化函數來重新構建操作。
基於您的評論,它聽起來就像你整理一個單值密鑰會在細胞內部結構。您可以通過將排序鍵提取到原始數值數組並調用內建的sort
來獲得很好的加速。
%// An example cell array of structs that I think looks like your input
c = num2cell(struct('foo',{'a','b','c','d'}, 'bar',{6 1 3 2}))
%// Let's say the "bar" field is what you want to sort on.
key = cellfun(@(s)s.bar, c) %// Extract the sort key using cellfun
[sortedKey,ix] = sort(key) %// Sort on just the key using fast numeric sort() builtin
sortedC = c(ix); %// ix is a reordering index in to c; apply the sort using a single indexing operation
reordering = cellfun(@(s)s.foo, sortedC) %// for human readability of results
如果您在多個域值排序,提取所有從n細胞米鍵值的n乘米陣列,其中列按降序優先級順序,並在其上使用sortrows
。
%// Multi-key sort
keyCols = {'bar','baz'};
key = NaN(numel(c), numel(keyCols));
for i = 1:numel(keyCols)
keyCol = keyCols{i};
key(:,i) = cellfun(@(s)s.(keyCol), c);
end
[sortedKey,ix] = sortrows(key);
sortedC = c(ix);
reordering = cellfun(@(s)s.foo, sortedC)
在Matlab中性能的關鍵之一是讓你的數據在原始數組中,並在這些原始數組上使用矢量化操作。看起來像C++ STL代碼的Matlab代碼以及對比較函數等的引用通常會很慢;即使您的代碼在O(n)複雜性方面表現良好,用戶級別M代碼操作的固定成本(特別是在非原始代碼上)也可能成爲殺手鐗。另外,如果你的結構是同類的(也就是說,它們都具有相同的字段集合),你可以直接將它們存儲在一個結構數組中,而不是結構的單元數組,它會更加緊湊。如果您可以進行更廣泛的重新設計,則將數據結構重新排列爲「平面組織」 - 即您擁有數組結構的地方,將所有字段的第i個元素作爲記錄讀取,而不是標量字段結構數組 - 可能是一個很好的效率勝利。這些重組中的任何一個都會使構建排序鍵陣列更便宜。
單元格中保存了哪些類型的數據? –
單元格包含具有幾個字段的結構。我需要通過存儲在其中一個字段中的值來顯式排序。因此,我會對這些字段進行比較,然後根據此比較對數字向量進行排序。由於複製,現在工作正常,除了速度。 – LiKao