2013-02-28 41 views

Trả lời

2

Bạn có thể gán từng lĩnh vực của một mảng của cấu trúc trực tiếp đến một mảng di động và sau đó bạn có thể sử dụng deal để chuyển đổi một struct để một mảng di động:

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: Hoặc dưới dạng Shai chỉ ra bạn có thể chỉ cần

[q.f] = s.f 
+6

trong khi bạn đang ở đó, tại sao không chỉ '[q.f] = s.f'? – Shai

+1

ya hoạt động. Tốt hơn nhiều – Dan

+0

Cảm ơn tất cả vì sự giúp đỡ của bạn! Shai của công trình chỉnh sửa tuyệt vời. Nhưng đề xuất của bạn với 'deal'command không hoạt động. Thông báo lỗi là: _ "Phía bên trái có c {:} bên trong dấu ngoặc, yêu cầu c phải xác định, để số kết quả mong đợi có thể được tính" _ – Massoud

2

Làm thế nào về arrayfun

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

Rõ ràng setfield chỉ dành cho việc thiết yếu tố một struct trong mảng struct - do đó arrayfun.

CHỈNH SỬA:
câu trả lời hay hơn được cung cấp bởi Dan.

+0

Bạn có thể áp dụng điều này mà không biết tên của 'f' và nhiều lĩnh vực như 'f'? Vì vậy, hãy thêm tất cả các trường từ s vào q? – Leo

+1

@Leo bạn có thể áp dụng phương thức từ [Câu trả lời của Dan] (http://stackoverflow.com/a/15135536/1714410) chỉ lặp trên tất cả các trường bằng cách sử dụng 'tên trường '. – Shai

1

Tôi muốn đưa ra đề xuất này bởi Shai rõ ràng hơn bởi vì nó dễ đọc hơn.

[q.f] = s.f

1

Mặc dù tôi muốn nói là khá @Dan's answer canon cho câu hỏi này, tôi muốn trình bày một sự thay thế:

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

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

Mặc dù hơn một chút dài dòng hơn cú pháp [q.f] = s.f, nó có lợi thế hoạt động như mong đợi ngay cả khi q chưa được phân bổ đúng kích thước để là bản sao của s.

Ví dụ:

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

[q.f] = s.f; 

Returns q.f như một 1x1 struct bằng s(1).f

Các vấn đề liên quan