您的示例中的结构未正确初始化的原因是您所使用的语法仅针对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