在不知道字段数量的情况下,如何更改结构中每个字段的值顺序?(MatLab)

在不知道字段数量的情况下,如何更改结构中每个字段的值顺序?(MatLab),matlab,structure,Matlab,Structure,编写一个名为sortStruct的函数,该函数接受一个结构数组 然后根据输入字段中的值对结构数组进行排序。 如果这些值是数值,则函数将它们从最低到最低排序 最高。如果值是字符,则函数将对 按字母顺序排列的与大小写有关的单词(例如,“Apples”在前面 “苹果”)。如果该字段在结构数组中不存在,则 函数返回字符串“无效字段名” 以下是我到目前为止的情况: function [ structsort ] = sortStruct( strucArray, fname ) if isfield(s

编写一个名为
sortStruct
的函数,该函数接受一个结构数组 然后根据输入字段中的值对结构数组进行排序。 如果这些值是数值,则函数将它们从最低到最低排序 最高。如果值是字符,则函数将对 按字母顺序排列的与大小写有关的单词(例如,“Apples”在前面 “苹果”)。如果该字段在结构数组中不存在,则 函数返回字符串“无效字段名”

以下是我到目前为止的情况:

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

除了语法错误之外,您似乎在正确的轨道上。以下是一些评论:

  • ISFIELD
    返回真/假
  • 测试变量数据类型的更好方法是使用**函数系列:
    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]

任何指点都很好。谢谢