2013-02-28 12 views

Odpowiedz

2

można przypisać każde pole tablicy kodowanym bezpośrednio do macierzy komórkowej, a następnie można użyć deal przekonwertować struct do tablicy komórek:

s(1).f = (1:3); 
s(2).f = (4:6); 
s(3).f = (7:9); 

q(1).n = 'nameA'; 
q(2).n = 'nameB'; 
q(3).n = 'nameC'; 

c = cell(3,1); 
[c{:}] = deal(s.f); 
[q.f] = c{:}; 

Here is a good article on this sort of thing

Edit: Lub jako Shai wskazuje, że można po prostu przejść

[q.f] = s.f 
+6

gdy jesteś na tym, dlaczego nie po prostu '[q.f] = s.f'? – Shai

+1

tak działa. Znacznie lepiej – Dan

+0

Dziękuję wszystkim za pomoc! Edycja Shai działa świetnie. Ale Twoja sugestia z poleceniem 'deal' nie działa. Komunikat o błędzie to: _ "Strona po lewej ma c {:} w nawiasach, co wymaga zdefiniowania c, aby można było obliczyć liczbę oczekiwanych wyników" _ – Massoud

2

Jak o arrayfun

q = arrayfun(@(x,y) setfield(x, 'f', y.f), q, s); 

Widocznie setfield jest tylko do ustawiania jeden element w tablicy struct struct - w ten sposób arrayfun.

EDIT:
znacznie lepiej Odpowiedź udzielona przez Dan.

+0

można zastosować ten nie znając nazwę 'f' i wielu dziedzinach, takich jak 'f'? Więc dodaj wszystkie pola od s do q? – Leo

+1

@Leo możesz zastosować tę metodę tylko w pętli [Dan's answer] (http://stackoverflow.com/a/15135536/1714410) we wszystkich polach, używając 'fieldnames'. – Shai

1

Chciałem, aby ta sugestia Shai była bardziej widoczna, ponieważ łatwiej ją przeczytać.

[q.f] = s.f

1

Chociaż powiedziałbym @Dan's answer jest dość kanon na to pytanie, chciałbym przedstawić alternatywę:

s(1).f = (1:3); 
s(2).f = (4:6); 
s(3).f = (7:9); 

[q(1:length(s)).f] = s.f; 

choć nieco bardziej gadatliwy niż składni [q.f] = s.f, ma przewaga funkcjonowania zgodnie z oczekiwaniami, nawet jeśli q nie została wstępnie przydzielona do prawidłowego rozmiaru, aby być kopią s.

Na przykład:

s(1).f = (1:3); 
s(2).f = (4:6); 
s(3).f = (7:9); 

[q.f] = s.f; 

Zwraca q.f jako 1x1 struct równej s(1).f