1

Modles1サイズ(1x180)のmatlab構造体配列があり、フィールドa、、、、...、 。があります。bcz

各フィールドにいくつの異なる値があるのか​​を理解したいと思います。すなわち

max(grp2idx([foo(:).a]))

上記は、フィールドaがdoubleの場合に機能します。 {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
4

1 に答える 1

5

実際、もっと良い方法があります。驚くべきことに、MATLAB では、キー文字列を使用せずに構造体フィールドにアクセスできますeval。たとえば、次のようになります。

Models1(1).(names{ix})

代わりに、次のように書くことができます。

className = class(Models1(1).(names{ix});
...
values = [Models1(:).(names{ix})];
...
values = {Models1(:).(names{ix})};

また、 と を使用する代わりに、 を使用classstrcmpて同じ条件をテストできますisa

v1 = Models1(1).(names{ix});
if (isa(v1, 'double') || isa(v1, 'logical'))
    values = [Models1(:).(names{ix})];
    % # ...
elseif (isa(v1, 'char'))
    values = {Models1(:).(names{ix})};
    % # ...
else
    disp(['Unrecognized class: ', class(v1)]);
end

それははるかに速いはずです。

于 2012-11-09T21:11:53.430 に答える