【问题标题】:MATLAB: Append row to an array without processing the entire arrayMATLAB:将行附加到数组而不处理整个数组
【发布时间】:2012-02-14 15:37:32
【问题描述】:

我正在以 1000Hz 的频率在眼动追踪系统上运行解决方案。数据以 X 和 Y 凝视位置坐标的形式来自眼动仪。我正在尝试将这两个坐标添加到数组的末尾。

我目前的解决方案如下:

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

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

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

【问题讨论】:

    标签: arrays matlab


    【解决方案1】:

    一些相关问题:

    Matrix of unknown length in MATLAB?

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


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

    没有一个很难,但它们都需要几行额外的代码。有关示例,请参阅上面的问题和答案。

    【讨论】:

      【解决方案2】:

      标准语法是

      gazepositionarray(end+1) = [x y]
      

      但您可以考虑执行以下操作:

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

      这样您将只复制log_2 n 次(例如,如果您有一百万个元素,则复制 19 次与 100 万次)。最后你可以把不用的部分剪掉。

      【讨论】:

      • 谢谢。我必须添加一个冒号和逗号以使其适用于两个维度,如下所示:gazepositionarray(end+1,:) = [x y]
      • 这并不比问题中的原始代码效率高。
      【解决方案3】:

      您必须预先分配内存。

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

      【讨论】:

      • 30 秒只是一个例子;它可以运行几分钟!但这很有用,谢谢
      • @CaptainProg:理想情况下,您知道需要多少内存,那么就不需要重新分配。如果不是这种情况,您应该始终重新分配一大块。通常,每次需要新内存时,最好将分配的内存大小加倍。 E 先生只是更改了语法,我认为这不会给您带来任何速度提升,除非 MATLAB 做了一些我在这种情况下不知道的聪明事情。
      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 2011-01-18
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多