Giả sử tôi có một mảng cấu trúc arr
, trong đó mỗi phần tử có một loạt các trường, bao gồm một phần được gọi là val
. Tôi muốn tăng lĩnh vực val
mỗi phần tử của một số lượng không đổi, như vậy:Cập nhật một trường trong mỗi phần tử của mảng cấu trúc Matlab
for i = 1:length(arr)
arr(i).val = arr(i).val + 3;
end
Điều này rõ ràng làm việc, nhưng tôi cảm thấy cần phải có một cách để làm điều này chỉ trong một dòng mã (và không cho vòng lặp). Điều tốt nhất tôi đã đưa ra là hai dòng và yêu cầu biến tạm thời:
newVals = num2cell([arr.val] + 3);
[arr.val] = deal(newVals{:});
Bất kỳ ý tưởng nào? Cảm ơn.
Cảm ơn tip trên 'deal'. Tôi không biết về 'setfield', do đó, nó xuất hiện để làm điều đó trong một dòng, nhưng như bạn nói, điều này chắc chắn tồi tệ hơn so với giải pháp cho vòng lặp. Đối với việc lập chỉ mục như thế, tôi đã xem xét nó một lúc trước; về cơ bản, Mathworks tuyên bố rằng việc hỗ trợ mọi thứ như thế sẽ buộc các thay đổi phá vỡ tính tương thích với trình phân tích cú pháp. Đó là một sự xấu hổ, vì nó lỗi cho tôi hầu như mỗi khi tôi viết bất kỳ mã Matlab nào. – Carl
Cảm ơn câu trả lời này! Trong MATLAB 2013b, [arr.val] = newVals {:} hoạt động BUT arr.val = newVals {:}. Chính xác những gì các dấu ngoặc làm trong trường hợp này? –
'arrayfun' chỉ là một trình bao bọc cho vòng lặp' for' trong MATLAB, vì vậy về mặt kỹ thuật bạn vẫn đang sử dụng vòng lặp, mặc dù trong ngụy trang. – Adriaan