2011-12-28 79 views
0

這是我的類:(方向):如何在matlab中的類/結構中運行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 

和等 但我找到一流的解決方案更多的權利......

+0

你能詳細說明你打算做什麼嗎?特別是 - 你的問題是遍歷所有屬性或數組的一個屬性? – bdecaf 2011-12-28 11:50:11

回答

2

我的第一個猜測是,你可能會感興趣的structfun

理論上它應該和類一起工作 - 實際上我發現matlab類是不可預測的。

+0

只要'fieldnames'返回你感興趣的屬性,我就會期待'structfun'工作。 – Nzbuu 2011-12-28 12:17:58

+0

它不會。 'Structfun'需要一個實際的結構,如果你傳遞一個對象,將會出錯。 – 2011-12-28 14:34:23

+0

我試過那個,但它變得很討厭... – user1117980 2011-12-29 10:23:08

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

太棒了!謝謝!我會看看 – user1117980 2011-12-29 10:22:10

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

THANKS.I'll試試吧 – user1117980 2011-12-29 10:22:22