2013-02-28 5 views

ответ

2

Вы можете назначить каждое поле массива структур непосредственно в массив ячеек, а затем вы можете использовать deal преобразовать-структуру в массив ячеек:

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: Или, как Shai указывает, что вы можете просто пойти

[q.f] = s.f 
+6

пока вы на нем, почему бы не просто '[q.f] = s.f'? – Shai

+1

ya это работает. Гораздо лучше – Dan

+0

Спасибо вам за помощь! Редактирование Shai отлично работает. Но ваше предложение с 'deal'command не работает. Сообщение об ошибке: _ «Левая сторона имеет c {:} внутри скобок, для чего требуется, чтобы c был определен, так что количество ожидаемых результатов может быть вычислено« – Massoud

2

Как насчет arrayfun

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

Видимо setfield только для установки один STRUCT элемента в массиве структуры - тот самый arrayfun.

EDIT:
гораздо лучше ответ дается Dan.

+0

Вы можете применить это, не зная имени 'F' и несколько полей, таких как 'F'? Итак, добавьте все поля от s до q? – Leo

+1

@Leo вы можете применить метод из ответа [Dan] (http://stackoverflow.com/a/15135536/1714410) только для всех полей, используя 'fieldnames'. – Shai

1

Я хотел сделать это предложение Шаем более заметным, потому что его легче читать.

[q.f] = s.f

1

Хотя я бы сказал, что @Dan's answer довольно канон на этот вопрос, я хотел бы представить альтернативу:

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

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

Хотя чуть более многословен, чем синтаксис [q.f] = s.f, он имеет преимущество функционирования, как и ожидалось, даже если q не был предварительно размещен до нужного размера, чтобы быть копией s.

Например:

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

[q.f] = s.f; 

Возвращает q.f как 1x1 struct равным s(1).f

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