[英]count elements falling within certain thresholds in array in matlab?
我有一个巨大的向量。 我必须计算落在某些范围内的值。 范围类似于 0-10、10-20 等。我必须计算落在某个范围内的值的数量。
我做了这样的事情:
for i=1:numel(m1)
if (0<m1(i)<=10)==1
k=k+1;
end
end
还:
if not(isnan(m1))==1
x=(0<m1<=10);
end
但是两次它都给出了包含全 1 的数组。 我做错了什么?
你可以做这样的事情(也适用于非整数)
k = sum(m1>0 & m1<=10)
您可以使用逻辑索引。 观察:
>> x = randi(40, 1, 10) - 20
x =
-2 17 -12 -9 -14 -14 15 4 2 -14
>> x2 = x(0 < x & x < 10)
x2 =
4 2
>> length(x2)
ans =
2
一步完成相同的操作:
>> length(x(0 < x & x < 10))
ans =
2
要计算特定范围内的值,您可以使用ismember
,
如果m1
是矢量使用,
k = sum(ismember(m1,0:10));
如果m1
是矩阵使用k = sum(sum(ismember(m1,0:10)));
例如,
m1=randi(20,[5 5])
9 10 6 10 16
8 9 14 20 6
16 13 14 7 11
16 15 4 12 14
4 16 3 5 18
sum(sum(ismember(m1,1:10)))
12
为什么不简单地做这样的事情?
% Random data
m1 = 100*rand(1000,1);
%Count elements between 10 and 20
m2 = m1(m1>10 & m1<=20);
length(m2) %number of elements of m1 between 10 and 20
然后你可以把东西放在一个循环中
% Random data
m1 = 100*rand(1000,1);
nb_elements = zeros(10,1);
for k=1:length(nb_elements)
temp = m1(m1>(10*k-10) & m1<=(10*k));
nb_elements(k) = length(temp);
end
然后nb_elements
包含您的数据,其中nb_elements(1)
用于 0-10 范围, nb_elements(2)
用于 10-20 范围,等等......
Matlab 不知道如何计算组合逻辑表达式
(0<m1(i)<=10)
你应该使用:
for i=1:numel(m1)
if (0<m1(i)) && (m1(i)<=10)
k=k+1;
end
end
并固定它可能是这样的:
sum((0<m1) .* (m1<=10))
或者您可以创建逻辑数组,然后使用逐元素乘法。 不知道这有多快,它可能会为大型数组使用大量内存。
像这样的东西
A(find((A>0.2 .* (A<0.8)) ==1))
生成值
A=兰特(5)
一 =
0.414906 0.350930 0.057642 0.650775 0.525488
0.573207 0.763477 0.120935 0.041357 0.900946
0.333857 0.241653 0.421551 0.737704 0.162307
0.517501 0.491623 0.016663 0.016396 0.254099
0.158867 0.098630 0.198298 0.223716 0.136054
找到值 > 0.8 和 < 0.2 的交集。 这将为您提供两个逻辑数组,其中A>0.2
和A<0.8
的值在逐元素乘法后将为=1
。
find((A>0.2 .* (A<0.8)) ==1)
然后将这些索引应用于A
A(find((A>0.2 .* (A<0.8)) ==1))
ans =
0.41491
0.57321
0.33386
0.51750
0.35093
0.76348
0.24165
0.49162
0.42155
0.65077
0.73770
0.22372
0.52549
0.90095
0.25410
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.