Как запустить поле foreach в классе / структуре в Matlab? - PullRequest
0 голосов
/ 28 декабря 2011

Это мой класс: (направление):

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 ]

2 голосов
/ 28 декабря 2011

Мое первое предположение, что вы можете быть заинтересованы в structfun

Теоретически это должно работать и с классами - практически я нахожу классы matlab непредсказуемыми.

1 голос
/ 28 декабря 2011

Получите 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
0 голосов
/ 28 декабря 2011

Вы можете свернуть свою собственную функцию, которая применяет функции к полям объекта, аналогично 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);

Но ... обычно именованные свойства объектов имеют определенные значения и роли, и было бы необычно применять одну и ту же операцию ко всем полям. Возможно, более разумно было бы хранить подобные свойства внутри структуры, которая сама находится в поле объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...