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 回答