Как вы можете изменить порядок значений каждого поля в структуре, не зная количества полей?(MatLab) - PullRequest
2 голосов
/ 02 июля 2011

Напишите функцию с именем sortStruct, которая принимает массив структуры, а затем сортирует массив структуры по значениям во введенном поле.Если значения являются числовыми, то функция сортирует их по убыванию.Если значения являются символами, то функция сортирует слова в алфавитном порядке с учетом регистра (например, «Яблоки» перед «яблоками»).Если поле не существует в структурном массиве, то функция возвращает строку «Неверное имя поля».

Вот что у меня есть:

function [ structsort ] = sortStruct( strucArray, fname )

if isfield(strucArray, fname) ~= '1'
    structsort = 'Invalid Field Name';
end

i = class(fname);

for i = 'double'
    [sorteddoub inddoub] = sort(fname);
    fieldn = fieldnames(strucArray);
    num = length(fieldn);
    strucArray = setfield(strucArray, fname, sorteddoub);

    structsort = setfield(strucArray, fieldn, fieldn(inddoub));
end

for i = 'char'
    [sortedchar indchar] = sort(char2num(fname(1)));
end

1 Ответ

2 голосов
/ 02 июля 2011

Вы, кажется, на правильном пути, кроме синтаксических ошибок.Итак, несколько комментариев:

  • 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...