Lý do cấu trúc trong ví dụ của bạn không được khởi tạo đúng cách là cú pháp bạn đang sử dụng chỉ địa chỉ phần tử cuối cùng trong mảng cấu trúc. Đối với mảng không tồn tại, phần còn lại của chúng được lấp đầy hoàn toàn bằng các cấu trúc có giá trị mặc định là []
trong tất cả các trường của chúng.
Để làm cho hành vi này rõ ràng, hãy thử làm một mảng ngắn với clear edges; edges(1:3) = struct('weight',1.0)
và xem từng ảnh edges(1)
, edges(2)
và edges(3)
.Các yếu tố edges(3)
có 1.0
trong trọng lượng của nó như bạn muốn; những người khác có []
.
Cú pháp để khởi tạo hiệu quả một mảng cấu trúc là một trong số các cấu trúc này.
% Using repmat and full assignment
edges = repmat(struct('weight', 1.0), [1 1000]);
% Using indexing
% NOTE: Only correct if variable is uninitialized!!!
edges(1:1000) = struct('weight', 1.0); % QUESTIONABLE
Lưu ý 1:1000
thay vì chỉ 1000
khi lập chỉ mục vào mảng cạnh chưa được khởi tạo.
Có sự cố với biểu mẫu edges(1:1000)
: nếu edges
đã được khởi chạy, cú pháp này sẽ chỉ cập nhật giá trị của các phần tử đã chọn. Nếu các cạnh có hơn 1000 phần tử, các phần tử khác sẽ không thay đổi và mã của bạn sẽ bị lỗi. Hoặc nếu edges
là một loại khác, bạn có thể gặp lỗi hoặc hành vi lạ tùy thuộc vào loại dữ liệu hiện có của nó. Để an toàn, bạn cần phải thực hiện clear edges
trước khi khởi tạo bằng cú pháp lập chỉ mục. Vì vậy, tốt hơn là chỉ thực hiện chuyển nhượng đầy đủ với biểu mẫu repmat
.
NHƯNG: Bất kể bạn khởi tạo nó như thế nào, một mảng cấu trúc như thế này sẽ luôn chạy chậm để làm việc với các tập dữ liệu lớn hơn. Bạn không thể thực hiện các hoạt động "vectorized" thực sự trên nó vì các mảng nguyên thủy của bạn được chia thành các mxArrays riêng biệt bên trong mỗi phần tử struct. Điều đó bao gồm việc phân công trường trong câu hỏi của bạn - không thể vector hóa điều đó. Thay vào đó, bạn nên chuyển đổi một struct-of-array như câu trả lời của Brian L gợi ý.
Nguồn
2014-03-17 16:53:16
bài đăng này có thể trợ giúp: http://stackoverflow.com/questions/4166438/how-do-i-define-a-structure-in-matlab/4169216#4169216 – Amro