我有这样的字符串:
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