Вы, кажется, на правильном пути, кроме синтаксических ошибок.Итак, несколько комментариев:
ISFIELD
возвращает true / false - лучший способ проверить тип данных переменных - это ** семейство функций:
ISNUMERIC
,ISSTRUCT
, ISCHAR
, ... - Вы должны прочитать разницу между конструкциями
if
/ for
/ ... - функция
SORT
может обрабатывать обавектор чисел и массив ячеек строк.Вы должны использовать эту функцию (сначала прочитайте страницу документации) - Синтаксис для динамического доступа к полям структуры:
structName.(dynamicExpression)
Сказав это, вот как я написал бы такоефункция:
function structSorted = sortStruct(structArray, fname)
if ~isfield(structArray,fname)
error('Invalid Field Name')
end
if isnumeric( structArray(1).(fname) )
data = [structArray.(fname)];
else
data = {structArray.(fname)};
end
[~,order] = sort(data);
structSorted = structArray(order);
end
И давайте протестируем функцию с некоторым случайным массивом структур:
%# lets build some array of structures
chars = char(97:122);
str = cellstr( chars(ceil(numel(chars).*rand(10,6))) );
[s(1:10).str] = str{:};
num = num2cell(rand(10,1));
[s(1:10).num] = num{:};
%# sort according to a field
s_str = sortStruct(s, 'str');
s_num = sortStruct(s, 'num');
%#s_err = sortStruct(s, 'zzzzz');
%# compare the two sorted array of structures
myS2C = @(s) squeeze(struct2cell(s))'; %'# a helper function to show results
myS2C(s_str)
myS2C(s_num)
Сортировка по полю str
дала:
>> myS2C(s_str)
ans =
'cbawoj' [ 0.10401]
'fqwiek' [ 0.17567]
'fskvdc' [ 0.46847]
'hezhbh' [ 0.33585]
'kyeaxv' [ 0.67539]
'ooumrm' [ 0.20895]
'qbnqit' [ 0.90515]
'wcwyjs' [0.056705]
'wdyhlz' [ 0.52189]
'ytdoze' [ 0.91213]
при сортировке по полю num
:
>> myS2C(s_num)
ans =
'wcwyjs' [0.056705]
'cbawoj' [ 0.10401]
'fqwiek' [ 0.17567]
'ooumrm' [ 0.20895]
'hezhbh' [ 0.33585]
'fskvdc' [ 0.46847]
'wdyhlz' [ 0.52189]
'kyeaxv' [ 0.67539]
'qbnqit' [ 0.90515]
'ytdoze' [ 0.91213]