Arrays Matlab中while循环中数组元素的添加和删除

Arrays Matlab中while循环中数组元素的添加和删除,arrays,matlab,Arrays,Matlab,我必须在Matlab中的while循环中将两个新的_元素添加到结构数组(活动_节点)中。元素的添加取决于if语句的真实值。我正在使用下面的方法,但这使得我的代码非常慢,因为我无法预分配“活动_节点”。有人能给我建议一些有效的方法来做这项工作吗。由于这个数组的确切长度事先不知道,因此在while循环的每个过程中,首先删除一个元素,然后添加两个新的元素,这会导致程序速度大大降低。顺便说一下,在while循环的开始处,数组“active_nodes”中只有一个元素 while isempty(acti

我必须在Matlab中的while循环中将两个新的_元素添加到结构数组(活动_节点)中。元素的添加取决于if语句的真实值。我正在使用下面的方法,但这使得我的代码非常慢,因为我无法预分配“活动_节点”。有人能给我建议一些有效的方法来做这项工作吗。由于这个数组的确切长度事先不知道,因此在while循环的每个过程中,首先删除一个元素,然后添加两个新的元素,这会导致程序速度大大降低。顺便说一下,在while循环的开始处,数组“active_nodes”中只有一个元素

while isempty(active_nodes)==0

    current_node = active_nodes(1);
    active_nodes(1) = [];
        if fval < some_statement
        [new_element(1), new_element(2)] = calculating_new_element(current_node)
        active_nodes = [new_element, active_nodes]
end
当isempty(活动节点)==0时
当前_节点=活动_节点(1);
活动_节点(1)=[];
如果fval
您可以通过在列表末尾添加新元素(实际上,将列表反转并向后读取)并使用指针保存最大的有效索引来消除元素的删除。这也消除了一些元素的创建

如果您对通过预先分配数组在任何时候列表中包含的最大元素数有所了解,则可以完全消除元素的创建

active_nodes = zeros(1, MAX_ELEMENTS);    %// if possible
active_nodes(1) = first_element;
p = 1;        %// current highest valid index

while p > 0

    current_node = active_nodes(p);    %// "pop" top element from stack
    p = p - 1;                         %// and point to next element
    if fval < some_statement
        [new_element(2), new_element(1)] = calculating_new_element(current_node)
        %// order of new_element values reversed, because list is reversed
        active_nodes(p+1:p+1) = new_element;
        p = p + 2        %// 2 new elements in list
    end
end
active_节点=零(1,最大元素);%//如果可能的话
活动_节点(1)=第一_元素;
p=1;%//当前最高有效索引
而p>0
当前_节点=活动_节点(p);%//堆栈中的“pop”顶部元素
p=p-1;%//并指向下一个元素
如果fval
您的情况妨碍了计算速度的提高。您不知道将有多少节点,通常矢量化或加速代码需要更多的先验知识。在加速方面,我看不到任何东西可以帮助您。我看不到您在哪里生成了多个新元素来替换已删除的元素。看起来您所做的只是清空结构数组,所以您的示例中一定缺少一些内容。另外,在数组末尾添加/删除元素似乎比在数组开头添加/删除元素更快。比克我已经在示例中做了必要的更改,现在请看一下。问题是代码变得非常慢,因为这个数组活动节点几乎在while循环的每个过程中都必须更改其大小两次(一次在元素被删除的开始,一次在'if'语句之后,当两个元素被添加到真值之后)。我已经发布了一个可能的解决方案,但我想给你增加一点提示。如果您使用@bicker等
@
标记某人,他们将收到通知,您已回复他们。如果你只是在评论中回答他们的问题或回答,这是没有必要的。