1

私はこれらのような文字列を持っています:

s{1,2} = 'string';
s{2,2} = 'string2';

そして、このようなワークスペース構造で

U.W.string = [2 2.5 3]

(ループ内で) s{1,2} または s{2,2} または s{i,2} が同じ名前の構造と一致することを確認したい。その場合、この構造体の値を変数 var(i) に代入します。どうすればそれができますか?

4

2 に答える 2

1

isfields文字列が構造体のフィールドの名前であるかどうかを確認するために使用します。次に、構文struct.(name)を使用します。ここnameで、 は文字列で、フィールドにアクセスします。コードは次のようになります。

test = struct('hello', 'world', 'count', 42, 'mean', 10);

fields = {'test', 'count';
          'hello', 'text';
          'more', 'less'};
values = {pi, 'dummy', -1};

for row = 1 : size(fields, 1)
    for column = 1 : size(fields, 2)
        if isfield(test, fields{row, column})
            test.(fields{row, column}) = values{row};
        end
    end
end

これは初期構造体を変換します

test =
    hello: 'world'
    count: 42
    mean: 10

これに

test =
    hello: 'dummy'
    count: 3.1416
    mean: 10

より短い実装は、内側のループを削除し、セル配列を に与えることによって実現されますisfields

for row = 1 : size(fields, 1)
    %# Note the parenthesis instead of curly braces in the next statement.
    match = isfield(test, fields(row, :));
    if any(match)
        test.(fields{row, match}) = values{row};
    end
end
于 2012-08-20T11:10:41.250 に答える
0

isfield(structName,fieldName) を使用します。これでうまくいくはずです:

strings{1,1} = 'foo';
strings{1,2} = 'bar';
strings{1, 3} = 'foobar';

U.W.foo = 1;
U.W.foobar = 5;

for idx = 1:length(strings)
    if(isfield(U.W,strings{1,idx}))
        expression = sprintf('outvar(idx) = U.W.%s',strings{1,idx});
        eval(expression);
    end
end
于 2012-08-20T11:16:50.877 に答える