首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MATLAB中有没有“队列”?

MATLAB中有没有“队列”?
EN

Stack Overflow用户
提问于 2010-11-10 15:37:34
回答 6查看 36.2K关注 0票数 23

我想把一个递归函数转换成一个迭代函数。我通常做的是,初始化一个队列,将第一个作业放入队列。然后,在while循环中,我使用队列中的作业并将新作业添加到队列中。如果我的递归函数多次调用自身(例如,遍历具有多个分支的树),则会添加多个作业。伪代码:

代码语言:javascript
运行
复制
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加到队列中如下所示:

代码语言:javascript
运行
复制
a = [a 3]

而移除元素是

代码语言:javascript
运行
复制
val = a(1);
a(1) = [];

如果我用正确的MATLAB方法,这个方法将会是一个性能杀手。

在MATLAB中有没有一种合理的方法来使用队列?

其他的数据结构呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-11-10 17:43:29

如果你坚持使用适当的数据结构,你可以在MATLAB中使用Java:

代码语言:javascript
运行
复制
import java.util.LinkedList
q = LinkedList();
q.add('item1');
q.add(2);
q.add([3 3 3]);
item = q.remove();
q.add('item4');
票数 36
EN

Stack Overflow用户

发布于 2010-11-10 17:42:19

对性能一无所知。

代码语言:javascript
运行
复制
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
票数 9
EN

Stack Overflow用户

发布于 2014-04-22 22:53:23

如果您可以处理预定义大小的FIFO队列,而不需要简单的直接访问,则只需使用模运算符和一些计数器变量:

代码语言:javascript
运行
复制
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数据存储,这不一定是问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4142190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档