Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays MATLAB:将行附加到数组,而不处理整个数组_Arrays_Matlab - Fatal编程技术网

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

Arrays MATLAB:将行附加到数组,而不处理整个数组,arrays,matlab,Arrays,Matlab,我正在1000Hz的眼动跟踪系统上运行一个解决方案。数据以X和Y凝视位置坐标的形式从眼球跟踪器输入。我试图将这两个坐标添加到数组的末尾 我目前的解决办法如下: gazePositionArray = []; while gazeDataIsAvailable [x y] = getNewCoordinates; gazePositionArray = [gazePositionArray; x y]; end 问题在于第四行。为了更新阵列,它复制旧阵列的内容,并在末端添

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

我目前的解决办法如下:

gazePositionArray = [];    
while gazeDataIsAvailable
    [x y] = getNewCoordinates;
    gazePositionArray = [gazePositionArray; x y];
end
问题在于第四行。为了更新阵列,它复制旧阵列的内容,并在末端添加新坐标。例如,对于记录的前30秒,这很好,但数组中存在的数据越多,计算机为创建新数组所需的处理就越多(30秒后,系统尝试每秒1000次复制30000行数据,每次迭代都会越来越多)

有没有一种方法可以将一行附加到MATLAB数组的末尾,而无需系统将整个数组复制到自身中?

标准语法是

gazepositionarray(end+1) = [x y]
但是你可以考虑这样做:

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

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

你必须预先分配内存

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

一些相关问题:


典型的解决方案是预先分配一个“大”内存块,并在需要时智能地复制到一个更大的内存块。我最喜欢的做法是,只要当前分配的资源已满,就将其规模扩大一倍,但还有其他办法


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

谢谢。我不得不添加一个冒号和逗号,以使其在两个维度上工作,如下所示:gazepositionarray(end+1,:)=[xy]这并不比问题中的原始代码更有效;它可以运行几分钟!但知道这一点很有用,thanks@CaptainProg:理想情况下,如果您知道需要多少内存,则无需重新分配。如果不是这样,你应该总是重新分配一大块。通常,每次需要新内存时,最好将分配的内存大小增加一倍。E先生只是改变了语法,我认为这不会给你带来任何速度提升,除非MATLAB做了一些我不知道的聪明的事情。