您的示例中的結構未正確初始化的原因是您所使用的語法僅針對struct數組中的最後一個元素。對於不存在的數組,其餘部分將隱含填充所有字段中缺省值爲[]
的結構。
爲了使此行爲清楚,請嘗試使用clear edges; edges(1:3) = struct('weight',1.0)
和edges(1)
,edges(2)
和edges(3)
中的每一個做一個短陣列。edges(3)
元素具有1.0
的重量,就像你想要的;其他人有[]
。
有效初始化結構數組的語法就是其中之一。
% 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
注1:1000
而不是僅僅1000
索引到未初始化的邊緣陣列時。
edges(1:1000)
表單存在問題:如果edges
已經初始化,則此語法將僅更新所選元素的值。如果邊緣有超過1000個元素,則其他邊緣將保持不變,並且您的代碼會變成bug。或者,如果edges
是不同的類型,則根據其現有的數據類型可能會出現錯誤或奇怪的行爲。爲了安全起見,在使用索引語法進行初始化之前,您需要執行clear edges
。所以最好只用repmat
表格完成全部任務。
但是:無論如何初始化它,像這樣的結構數組在處理較大的數據集時總是會很慢。你不能對它進行真正的「矢量化」操作,因爲你的原始數組全部被分解,以便在每個struct元素中分離mxArrays。這包括您的問題中的字段分配 - 無法對此進行矢量化。相反,你應該像Brian L的回答所暗示的那樣切換一個數組結構。
這篇文章可能會有所幫助:http://stackoverflow.com/questions/4166438/how-do-i-define-a-structure-in-matlab/4169216#4169216 – Amro