私はこれらのような文字列を持っています:
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) に代入します。どうすればそれができますか?
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
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