我想把一个递归函数转换成一个迭代函数。我通常做的是,初始化一个队列,将第一个作业放入队列。然后,在while循环中,我使用队列中的作业并将新作业添加到队列中。如果我的递归函数多次调用自身(例如,遍历具有多个分支的树),则会添加多个作业。伪代码:
queue = new Queue();
queue.put(param);
result = 0;
while (!queue.isEmpty()) {
param = queue.remove();
// process param and obtain new param(s)
// change result
queue.add(param1);
queue.add(param2);
}
return result;
不过,我在MATLAB中找不到任何类似队列的结构。我可以使用向量来模拟队列,其中将3加到队列中如下所示:
a = [a 3]
而移除元素是
val = a(1);
a(1) = [];
如果我用正确的MATLAB方法,这个方法将会是一个性能杀手。
在MATLAB中有没有一种合理的方法来使用队列?
其他的数据结构呢?
发布于 2010-11-10 17:43:29
如果你坚持使用适当的数据结构,你可以在MATLAB中使用Java:
import java.util.LinkedList
q = LinkedList();
q.add('item1');
q.add(2);
q.add([3 3 3]);
item = q.remove();
q.add('item4');
发布于 2010-11-10 17:42:19
对性能一无所知。
classdef Queue < handle
properties ( Access = private )
elements
nextInsert
nextRemove
end
properties ( Dependent = true )
NumElements
end
methods
function obj = Queue
obj.elements = cell(1, 10);
obj.nextInsert = 1;
obj.nextRemove = 1;
end
function add( obj, el )
if obj.nextInsert == length( obj.elements )
obj.elements = [ obj.elements, cell( 1, length( obj.elements ) ) ];
end
obj.elements{obj.nextInsert} = el;
obj.nextInsert = obj.nextInsert + 1;
end
function el = remove( obj )
if obj.isEmpty()
error( 'Queue is empty' );
end
el = obj.elements{ obj.nextRemove };
obj.elements{ obj.nextRemove } = [];
obj.nextRemove = obj.nextRemove + 1;
% Trim "elements"
if obj.nextRemove > ( length( obj.elements ) / 2 )
ntrim = fix( length( obj.elements ) / 2 );
obj.elements = obj.elements( (ntrim+1):end );
obj.nextInsert = obj.nextInsert - ntrim;
obj.nextRemove = obj.nextRemove - ntrim;
end
end
function tf = isEmpty( obj )
tf = ( obj.nextRemove >= obj.nextInsert );
end
function n = get.NumElements( obj )
n = obj.nextInsert - obj.nextRemove;
end
end
end
发布于 2014-04-22 22:53:23
如果您可以处理预定义大小的FIFO队列,而不需要简单的直接访问,则只需使用模运算符和一些计数器变量:
myQueueSize = 25; % Define queue size
myQueue = zeros(1,myQueueSize); % Initialize queue
k = 1 % Counter variable
while 1
% Do something, and then
% Store some number into the queue in a FIFO manner
myQueue(mod(k, myQueueSize)+1) = someNumberToQueue;
k= k+1; % Iterate counter
end
这种方法非常简单,但缺点是不像典型的队列那样容易访问。换句话说,最新的元素将始终是元素k,而不是元素1等。对于某些应用程序,例如用于统计操作的FIFO数据存储,这不一定是问题。
https://stackoverflow.com/questions/4142190
复制相似问题