最近复现一篇论文,文章中要求缓冲当前时刻及前
N
−
1
N-1
N−1个测量、以及对应的滤波方差矩阵,就想到了环形缓冲器,不知我理解是否准确,我创建了一个长度为
N
N
N的缓冲区,然后使用一个索引数字对应该缓冲区的开头,然而众所周知,MATLAB中所有数值数据都是用矩阵保存,这让我想要适配更多维的矩阵,从而产生了下面的尝试,发现非常好用!主要的方法是使用eval
函数将:,
的维数减一次拼接转换为命令,从而实现任意维度的
N
N
N个测量只要输入,就可以输出其对应的正确顺序的值。
function bufferValue = readBuffer(buffer, bufferStart)
% buffer的最后一个维度为索引
colonStr = ':,';
colonNum = ndims(buffer) - 1;
colonJoinStr = repmat(colonStr,[1,colonNum]);
bufferLastDimSize = size(buffer,ndims(buffer));
bufferValue = zeros(size(buffer));
for index = bufferStart:bufferStart+bufferLastDimSize-1
indexTmp = index - (floor((index - 1) / bufferLastDimSize) * bufferLastDimSize);
indexReal = index - bufferStart + 1;
eval(strcat('bufferValue(',colonJoinStr,num2str(indexReal),')','=','buffer(',colonJoinStr,num2str(indexTmp),');'))
end
end