在不知道字段数量的情况下,如何更改结构中每个字段的值顺序?(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]
任何指点都很好。谢谢