对Matlab的多个调用进行矢量化&x27;查找';

对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]

我对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作为向量包含会产生错误。如果矢量化是不可能的,那么任何其他建议的速度将不胜感激。我想要解决的实际问题在[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);