2011-12-28 2 views
0

Это мой класс: (направление):Как запустить поле foreach в классе/структуре в matlab?

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)

теперь попробовать STRUCT решение:
Я использую в настоящее время в

road(1).direction 

и т.д. , но я нахожу класс решение больше прав ...

+0

Вы можете уточнить, что вы планируете делать? Особенно - это ваша проблема, связанная со всеми свойствами или над массивом для одного свойства? – bdecaf

ответ

2

Моя первая догадка вы можете быть заинтересованы в structfun

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

+0

Я бы ожидал, что 'structfun' будет работать до тех пор, пока' fieldnames' вернет свойства, которые вас интересуют. – Nzbuu

+0

Это не так. 'Structfun' требует фактической структуры и будет ошибкой, если вы передадите ему объект. –

+0

Я пробовал этот, но он был противным ... – user1117980

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 
+0

GREAT! СПАСИБО! Я посмотрю – user1117980

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); 

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

+0

СПАСИБО. Я попробую – user1117980

Смежные вопросы