我有一个变量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但我不明白代码:(。
答案 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>0
和max(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)