1

我在变量中有一个数据列向量vdata和一个 indeces 列表idx。我想vdata在每个索引x之前和x之后访问索引idx。我会在 for 循环中执行此操作的一种方法是:

x = 10;
accessed_data = [];
for (ii = 1:length(idx))
    accessed_data = vdata(idx-x:idx+x);
end

有没有办法在矢量化函数中做到这一点?我在这里找到了一个非常相似问题的解决方案:通过向量中的索引寻址多个范围,但我不明白代码:(。

4

3 回答 3

2

一种使用直接索引而不是for循环的方案:

xx = (-x:x).';                            % Range of indices
idxx = bsxfun(@plus,xx(:,ones(1,numel(idx))),idx(:).'); % Build array
idxx = idxx(:);                           % Columnize to interleave columns
idxx = idxx(idxx>=1&idxx<=length(vdata)); % Make sure the idx+/-x is valid index
accessed_data = vdata(idxx);              % Indices of data

第二行可以替换为@Shai 答案中第一行的形式。该方案检查所有结果索引是否有效。因为可能必须删除一些,所以您最终可能会得到一个参差不齐的数组。解决这个问题的一种方法是使用元胞数组,但在这里我只是制作idxx了一个向量,因此accessed_data也是如此。

于 2013-07-29T20:46:10.103 回答
2

假设min(idx)-x>0然后max(idx)+x<=numel(vdata)你可以简单地做

 iidx = bsxfun(@plus, idx(:), -x:x); % create all indices
 accessed_data = vdata( iidx );
于 2013-07-29T21:08:38.423 回答
0

这给出了矩阵中的解决方案,其中的每个值对应一行idx。它假定 中的所有值idx都大于或等于x,并且小于或等于length(vdata)-x

% Data
x = 10;
idx = [12 20 15];
vdata = 1:100;

ind = repmat(-x:x,length(idx),1) + repmat(idx(:),1,2*x+1);
vdata(ind)
于 2013-07-29T21:14:28.403 回答