Is there a “queue” in MATLAB?

后端 未结 7 1820
温柔的废话
温柔的废话 2020-12-28 16:14

I want to convert a recursive function to a iterative one. What I normally do is, I initialize a queue, put the first job into queue. Then in a while loop I consume

7条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-28 16:33

    Ok, here's a quick-and-dirty, barely tested implementation using a MATLAB handle class. If you're only storing scalar numeric values, you could use a double array for "elements" rather than a cell array. No idea about performance.

    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
    

提交回复
热议问题