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

以矢量化方式访问MATLAB中的数据范围,matlab,vectorization,Matlab,Vectorization,我有一个变量vdata中的数据列向量和一个索引列表idx。我想在idx中的每个索引之前和之后的x索引处访问vdata。在for循环中执行此操作的一种方法是: x = 10; accessed_data = []; for (ii = 1:length(idx)) accessed_data = vdata(idx-x:idx+x); end 有没有一种方法可以在矢量化函数中实现这一点?我在这里找到了一个非常类似的问题的解决方案:但我不理解代码:(.一种使用直接索引而不是进行循环的方案:

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

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

有没有一种方法可以在矢量化函数中实现这一点?我在这里找到了一个非常类似的问题的解决方案:但我不理解代码:(.

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

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
xx=(-x:x)。;%索引范围
idxx=bsxfun(@plus,xx(:,ones(1,numel(idx))),idx(:).;%生成数组
idxx=idxx(:);%列化以交错列

idxx=idxx(idxx>=1&idxx一种使用直接索引而不是
进行循环的方案:

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
xx=(-x:x)。;%索引范围
idxx=bsxfun(@plus,xx(:,ones(1,numel(idx))),idx(:).;%生成数组
idxx=idxx(:);%列化以交错列

idxx=idxx(idxx>=1&idxx假设
min(idx)-x>0
max(idx)+x假设
min(idx)-x>0
max(idx)+x这给出了矩阵中的解,其中
idx
中的每个值对应一行。它假设
idx
中的所有值都大于或等于
x
,并且小于或等于
长度(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)

这在矩阵中给出了解决方案,其中
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)

你到底想要什么结果?每个
ii
都有一行的矩阵?你到底想要什么结果?每个
ii
都有一行的矩阵?他们什么时候开始允许你对两个转置向量应用
bsxfun
?我总是记得必须先构建一个矩阵,这样两个inp的非单态维度ut数组会相互匹配吗?但现在我在R2012b中看到了这一点。我困惑了吗?@horchler AFAIK一直都是这样。有关更多示例,请参阅标记wiki(欢迎提供)。来自R2007a(该函数的首次亮相)似乎在支持你。我不知道我是不是接受了这个想法。
BSXFUN
非常合适。我以前从未听说过这个函数,但这正是我所需要的。谢谢Shai和horchler!@navr91
BSXFUN
是一个很棒的函数。访问它的Wiki他们什么时候开始允许你对两个转置向量应用
BSXFUN
?我一直记得必须先构建一个矩阵,以便两个输入数组的非单体维度能够相互匹配?但现在我看到R2012b中的这一点。我是否感到困惑?@horchler AFAIK一直都是这样。有关更多示例,请参阅tag wiki(欢迎提供)。来自R2007a(该函数的首次亮相)似乎在支持你。我不知道我是不是接受了这个想法。
BSXFUN
非常合适。我以前从未听说过这个函数,但这正是我所需要的。谢谢Shai和horchler!@navr91
BSXFUN
是一个很棒的函数。我担心,访问它的wiki完全是无知的。
BSXFUN
更快吗?请查看标签wiki获取更多信息更多info@Shai:在过去,
repmat
不是作为本机函数实现的,它确实可能会很慢。现在就不那么慢了(我不确定这发生在哪个版本)另外,在我自己的硬件上,我看到
bsxfun
实际上比复制足够小的阵列的方法要慢。不知道为什么(内存分配速度与CPU速度?).然而,如果要针对最坏的情况进行优化,那么
bsxfun
就是一条路。恐怕完全是无知。
bsxfun
更快吗?更多信息,请查看标签wikiinfo@Shai:在过去,
repmat
不是作为本机函数实现的,它确实可能会很慢。现在就不那么慢了(我不确定这发生在哪个版本)。另外,在我自己的硬件上,我看到
bsxfun
实际上比复制足够小的阵列的方法要慢。不知道为什么(内存分配速度vs.CPU速度?)。但是,如果要针对最坏的情况进行优化,那么
bsxfun
是一条路要走。