以矢量化方式访问数据范围MATLAB

时间:2013-07-29 20:37:11

标签: matlab vectorization

我有一个变量vdata的数据列向量和一个变量列表idx。我希望在vdata之前的x以及x中的每个索引之后idx访问x = 10; accessed_data = []; for (ii = 1:length(idx)) accessed_data = vdata(idx-x:idx+x); end 。我在for循环中执行此操作的一种方法是:

{{1}}

有没有办法在矢量化函数中执行此操作?我在这里找到了一个非常相似问题的解决方案:Addressing multiple ranges via indices in a vector但我不明白代码:(。

3 个答案:

答案 0 :(得分: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也是如此。

答案 1 :(得分:2)

假设min(idx)-x>0max(idx)+x<=numel(vdata),您只需执行

即可
 iidx = bsxfun(@plus, idx(:), -x:x); % create all indices
 accessed_data = vdata( iidx );

答案 2 :(得分: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)