我正在1000Hz的眼动追踪系统上运行解决方案。数据以眼睛跟踪器以X和Y注视位置坐标的形式进入。我试图将这两个坐标添加到数组的末尾。
我目前的解决方案如下:
gazePositionArray = [];
while gazeDataIsAvailable
[x y] = getNewCoordinates;
gazePositionArray = [gazePositionArray; x y];
end
问题在于第四行。为了使阵列更新,它会复制旧数组的内容并在最后添加新的坐标。这很好,例如,对于记录的前30秒,但是阵列中存在的数据越多,计算机为创建新阵列而必须执行的处理越多(系统尝试复制30,000秒后30秒)每秒1000次的数据行 - 每次迭代越来越多)
有没有办法将一行附加到MATLAB数组的末尾而系统不必将整个数组复制到自身?
答案 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