对Matlab的多个调用进行矢量化&x27;查找';
我对Matlab的find函数进行了大量调用。例如,以下内容应给出要点:对Matlab的多个调用进行矢量化&x27;查找';,matlab,find,vectorization,Matlab,Find,Vectorization,我对Matlab的find函数进行了大量调用。例如,以下内容应给出要点: x=rand(1,10^8); indx=zeros(1,10^8); for i=1:10^8 indx(i) = find([0.2, 0.52, 0.76,1] < x(i), 1, 'last'); end x=rand(1,10^8); indx=零(1,10^8); 对于i=1:10^8 indx(i)=find([0.2,0.52,0.76,1]
x=rand(1,10^8);
indx=zeros(1,10^8);
for i=1:10^8
indx(i) = find([0.2, 0.52, 0.76,1] < x(i), 1, 'last');
end
x=rand(1,10^8);
indx=零(1,10^8);
对于i=1:10^8
indx(i)=find([0.2,0.52,0.76,1]
有没有办法将代码矢量化以加快速度?仅将x作为向量包含会产生错误。如果矢量化是不可能的,那么任何其他建议的速度将不胜感激。我想要解决的实际问题在[0.2,0.52,0.76,1]处有一个相当长的向量,因此任何解决方案都不应该依赖于我提供的特定向量
谢谢。使用x
获得一个逻辑矩阵,指示vec
中小于x
的值。将该逻辑矩阵与表示列下标的列向量相乘。用于查找满足不等式的最大(最后)索引。对于不等式不满足的情况,你将得到零
vec = [0.2, 0.52, 0.76, 1]; %Your vector
indx = bsxfun(@lt, vec(:), x); %Making 'vec' a column matrix and comparing with 'x'
indx = max(bsxfun(@times, indx, (1:numel(vec)).')); %The required result
对于R2016b及更高版本,您可以使用隐式扩展,而不是:
indx=vec(:) 根据您的示例,您可能需要考虑使用<代码>离散化< /代码>函数:
x=rand(1,10^8);
edges = [0.2, 0.52, 0.76, 1];
indx = discretize(x, edges, 'IncludedEdge', 'right');
请注意,超出范围的情况将导致NaN
% small test case
% x = [0.5198, 0.0768, 0.6788, 0.9496]
% indx = discretize(x, edges, 'IncludedEdge', 'right')
% answer: 1 NaN 2 3
当然,这仅在您试图找到x在有序集合中的位置时才适用。对于MATLAB版本R2015a和更新版本,的答案给出了最佳选项,使用:
x
中超出边范围的任何值的索引将为NaN
对于MATLAB版本的R2014b和更新版本,您还可以使用:
discretize
的不同之处在于,您还可以获得每个箱子中的值计数(第一次输出),并且x
中边缘范围以外的值的索引将为0
对于R2014b之前的MATLAB版本,您可以使用(在较新版本中已弃用):
同样,您还可以获得每个箱子中的值计数(第一次输出),并且x
中边缘范围之外的值的索引将是0
,在该示例中,结果始终是4
。你确定你想要'last'
?对……我已经翻转了不等式(在我最近的编辑中),使它变得不平凡。只是试图构造一个玩具问题,用一种简单的方式抓住真正的问题。感谢您发现它。警告:如果不等式不满足x
,您的循环将给出错误。尝试使用x
中小于0.2
的任何值,这并不是说它在大多数情况下都很明显,而是比(end:-1:1)
快2倍左右。这是一个多么有用的函数。它很快…对我来说,计算时间减少了大约100倍。谢谢
% small test case
% x = [0.5198, 0.0768, 0.6788, 0.9496]
% indx = discretize(x, edges, 'IncludedEdge', 'right')
% answer: 1 NaN 2 3
edges = [0.2, 0.52, 0.76, 1];
indx = discretize(x, edges, 'IncludedEdge', 'right');
[~, ~, indx] = histcounts(x, edges);
[~, indx] = histc(x, edges);