【发布时间】:2012-11-10 06:57:38
【问题描述】:
我有一个大小为 (1x180) 的 matlab 结构数组 Modles1,其中包含字段 a、b、c、...、z。
我想了解每个字段中有多少不同的值。即
max(grp2idx([foo(:).a]))
如果字段a 是双精度,则上述方法有效。 {foo(:).a} 需要在字段 a 是字符串/字符的情况下使用。
这是我当前执行此操作的代码。我讨厌不得不使用 eval,而这本质上是一个 switch 语句。有没有更好的办法?
names = fieldnames(Models1);
for ix = 1 : numel(names)
className = eval(['class(Models1(1).',names{ix},')']);
if strcmp('double', className) || strcmp('logical',className)
eval([' values = [Models1(:).',names{ix},'];']);
elseif strcmp('char', className)
eval([' values = {Models1(:).',names{ix},'};']);
else
disp(['Unrecognized class: ', className]);
end
% this line requires the statistics toolbox.
[g, gn, gl] = grp2idx(values);
fprintf('%30s : %4d\n',names{ix},max(g));
end
【问题讨论】:
-
eval 的使用确实是最好尽量少用,但是一个 switch 也是不错的做法。如果你想让它看起来更好,你可以使用实际的 switch case 语法。
-
@Dennis 这不是我不喜欢的开关,而是我必须切换以处理不同的类类型。这让我觉得很丑。
标签: matlab reflection structure