MATLAB:将行附加到数组而不处理整个数组

时间:2012-02-14 15:37:33

标签: arrays matlab

我正在1000Hz的眼动追踪系统上运行解决方案。数据以眼睛跟踪器以X和Y注视位置坐标的形式进入。我试图将这两个坐标添加到数组的末尾。

我目前的解决方案如下:

gazePositionArray = [];    
while gazeDataIsAvailable
    [x y] = getNewCoordinates;
    gazePositionArray = [gazePositionArray; x y];
end

问题在于第四行。为了使阵列更新,它会复制旧数组的内容并在最后添加新的坐标。这很好,例如,对于记录的前30秒,但是阵列中存在的数据越多,计算机为创建新阵列而必须执行的处理越多(系统尝试复制30,000秒后30秒)每秒1000次的数据行 - 每次迭代越来越多)

有没有办法将一行附加到MATLAB数组的末尾而系统不必将整个数组复制到自身?

3 个答案:

答案 0 :(得分:3)

标准语法是

gazepositionarray(end+1) = [x y]

但你可以考虑做一些事情:

  • 为初始数组(zeros()
  • 分配空间
  • 为使用的最大索引保留变量
  • 每次都达到数组限制,复制到一个大小翻倍的数组。

这样您只会复制log_2 n次(例如,如果您有一百万个元素,则会复制19次,而不是100万次)。最后,你可以砍掉未使用的部分。

答案 1 :(得分:3)

一些相关问题:

Matrix of unknown length in MATLAB?

Pre-allocating memory in MATLAB à la std::vector::reserve(n)


典型的解决方案是预先分配“大”内存,并在需要时巧妙地复制到更大的内存块。我最喜欢的是在当前分配变满时将大小加倍,但还有其他分配。

没有什么是困难的,但它们都需要一些额外的代码行。有关示例,请参阅上面的问题和答案。

答案 2 :(得分:1)

您必须预先分配内存。

gazePositionArray = zeros(30000,2);
counter = 1;    
while gazeDataIsAvailable
    [x y] = getNewCoordinates;
    gazePositionArray(counter,:) = [x y];
    counter = counter + 1;
end