如何在matlab中的类/结构中运行foreach字段?

时间:2011-12-28 09:48:21

标签: class matlab struct foreach

这是我的班级:(方向):

classdef direction
    properties
        up    = zeros(4,5)
        down  = zeros(4,5)
        left  = zeros(4,5)
        right = zeros(4,5)
    end

    %%% 
    methods

    end
end

我希望能够运行一个 对于'方向'中的每个字段 做一点事 但我不知道如何使用它。

现在我正在使用 ROAD.up = ... 但我最后会想要更多的字段(16或32)

我现在尝试一个结构解决方案:
我现在正在使用

road(1).direction

等 但我觉得课堂解决方案更合适......

3 个答案:

答案 0 :(得分:2)

我的第一个猜测是您可能对structfun

感兴趣

理论上它应该也适用于类 - 实际上我发现matlab类是不可预测的。

答案 1 :(得分:1)

获取properties并循环播放它们:

d = direction
p = properties(d)
for k = 1:length(p)
  prop = p{k};
  d.(prop) = k
end

例如,上面的代码将以:

开头
d = 
  direction
Properties:
   up: [4x5 double]
 down: [4x5 double]
 left: [4x5 double]
right: [4x5 double]

并导致:

d = 
  direction
Properties:
   up: 1
 down: 2
 left: 3
right: 4

如果您想自己指定列表,可以使用字符串的单元格数组并使用obj.('name')运算符:

p = {'up', 'down', 'left', 'right'};
k = 2; % Have a loop here instead
d.(p{k}) = 5; % Set property value

答案 2 :(得分:0)

您可以滚动自己的函数,将函数应用于对象字段,与structfun类似。

function out = objfieldfun(x, fcn)
%OBJFIELDFUN Apply a function to every field of an object
out = x;
fields = fieldnames(x);
for iX = 1:numel(x)
    for iField = 1:numel(fields)
        out(iX).(fields{iField}) = feval(fcn, x(iX).(fields{iField}));
    end
end

然后你可以像这样使用它。

d = direction;
d2 = objfieldfun(d, @(x)x+2);

但是......通常对象的命名属性具有特定的含义和角色,并且将相同的操作应用于所有字段并不常见。也许更有意义的是将类似的属性藏在结构中,该结构本身位于对象的字段中。