MATLAB:Matrix Index超出删除范围

时间:2015-07-09 10:03:48

标签: arrays matlab fifo

我有这个函数,我使用一个数组作为FIFO队列(即,将元素放入其中并使用先到先服务方法处理它们)。特别是,我将这个数组称为MsgQueue,因为它保存了消息。

当发送新的msg(事件)时使用MsgQueue,这会触发 handleMsgSent()方法的执行,我将在下面显示该方法

function handleMsgSent(this, msg)

        this.MsgQueue = [this.MsgQueue msg];

        while(numel(this.MsgQueue) > 0)
            m = this.MsgQueue(1);
            this.MsgQueue = this.MsgQueue(2:end); % <----- OPTION A


            % DO WHATEVER WITH THE MESSAGE


            %this.MsgQueue(1) = []; % <------ OPTION B
        end            
    end

如您所见,我已使用 OPTION A OPTION B 注释标记了代码。因此,关键是选项B最终会出现“矩阵索引超出删除范围”错误,而选项A工作(显然)完全正常,没有错误。

任何人都可以帮我理解其中的区别吗?好吧,我知道选项A不会删除任何东西,只是“丢弃”数组的第一个元素,但是,如果MsgQueue中至少有一个元素,为什么选项B无法删除?

2 个答案:

答案 0 :(得分:0)

对于空数组,end0。如果检查冒号运算符的文档,对于start&gt; end,它将返回一个空数组。因此,第一个选项在某些情况下删除注释,而第二个选项始终索引第二个元素。

答案 1 :(得分:0)

在调试我的代码后,我似乎意识到了原因。在我的代码中有一个评论:

% DO WHATEVER WITH THE MESSAGE

问题在于,此时我正在调用另一个触发新消息的方法,从而再次进入 handleMsgSent()方法。因此,当我在此之前修改MsgQueue时我没有任何问题,但是当我之后这样做时,我遇到了麻烦。