Реализация сортировки сложных данных в пользовательском М-коде, вероятно, приведет к потере производительности из-за накладных расходов на операции уровня М по сравнению со встроенными в 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
Если вы сортируете по нескольким значениям поля, извлеките все mзначения ключа из n ячеек в массив размером n на m со столбцами в порядке убывания приоритета и использование 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 - этополучить ваши данные в примитивных массивах и использовать векторизованные операции с этими примитивными массивами.Код Matlab, который выглядит как код C ++ STL с алгоритмами и ссылками на функции сравнения и тому подобное, часто будет медленным;даже если ваш код хорош с точки зрения сложности O (n), фиксированная стоимость операций М-кода пользовательского уровня, особенно над не примитивами, может быть убийственной.
Кроме того, если ваши структуры однородны(то есть все они имеют одинаковый набор полей), вы можете хранить их непосредственно в массиве структур вместо массива структур ячеек, и он будет более компактным.Если вы можете сделать более обширный редизайн, переставьте ваши структуры данных, чтобы они были «планарно организованы» - где у вас есть структура массивов, считывающая через i-й элемент всех полей как запись, вместо массива структур скалярных полей.- может быть хорошая победа эффективности.Любая из этих реорганизаций удешевит создание массива ключей сортировки.