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