我有一个矩阵A
。现在我想找到大于5的元素数量及其相应的索引。如何在不使用for循环的情况下在matlab中解决这个问题?
例如,如果A = [1 4 6 8 9 5 6 8 9]'
:
[3 4 5 7 8 9]
答案 0 :(得分:14)
您使用find
:
index = find(A>5);
numberOfElements = length(index);
答案 1 :(得分:4)
您使用sum
,它允许您使用一个命令获取元素数量:
numberOfElements = sum(A>5);
你真的需要明确的指数吗?因为逻辑矩阵A>5
也可以用作索引(通常比使用find
索引更有效):
index = (A>5);
numberOfElements = sum(index);
为了完整性:使用逻辑索引与常规索引相同:
>> A(A>5)
ans =
6 8 9 6 8 9
答案 2 :(得分:2)
在上面与Rody的讨论的推动下,这是一个简单的基准测试,它测试MATLAB中整数与逻辑数组索引的速度。相当重要的一点,我会说,因为'矢量化'MATLAB主要是关于索引。所以
% random data
a = rand(10^7, 1);
% threashold - how much data meets the a>threashold criterion
% This determines the total indexing time - the more data we extract from a,
% the longer it takes.
% In this example - small threashold meaning most data in a
% will meet the criterion.
threashold = 0.08;
% prepare logical and integer indices (note the uint32 cast)
index_logical = a>threashold;
index_integer = uint32(find(index_logical));
% logical indexing of a
tic
for i=1:10
b = a(index_logical);
end
toc
% integer indexing of a
tic
for i=1:10
b = a(index_integer);
end
toc
在我的电脑上,结果是
Elapsed time is 0.755399 seconds.
Elapsed time is 0.728462 seconds.
意味着两种方法的表现几乎相同 - 这就是我选择示例threashold
的方式。这是有意义的,因为index_integer
数组几乎要大4倍!
index_integer 9198678x1 36794712 uint32
index_logical 10000000x1 10000000 logical
对于threashold
整数索引的较大值,速度更快。 threashold=0.5
的结果:
Elapsed time is 0.687044 seconds. (logical)
Elapsed time is 0.296044 seconds. (integer)
除非我在这里做错了,否则整数索引似乎是大多数时候最快的。
在测试中包括创建索引会产生非常不同的结果:
a = rand(1e7, 1);
threshold = 0.5;
% logical
tic
for i=1:10
inds = a>threshold;
b = a(inds);
end
toc
% double
tic
for i=1:10
inds = find(a>threshold);
b = a(inds);
end
toc
% integer
tic
for i=1:10
inds = uint32(find(a>threshold));
b = a(inds);
end
toc
结果(Rody):
Elapsed time is 1.945478 seconds. (logical)
Elapsed time is 3.233831 seconds. (double)
Elapsed time is 3.508009 seconds. (integer)
结果(angainor):
Elapsed time is 1.440018 seconds. (logical)
Elapsed time is 1.851225 seconds. (double)
Elapsed time is 1.726806 seconds. (integer)
因此,在使用整数进行索引时,实际索引似乎更快,但是从前到后,逻辑索引的执行效果要好得多。
最后两种方法之间的运行时差异是意料之外的 - 似乎Matlab的内部结构要么没有将双精度转换为整数,要么在执行实际索引之前对每个元素执行错误检查。否则,我们会看到双重和整数方法之间几乎没有区别。
修改我看到了两个选项:
第二个选项应该更快,因为我们只需要读取一次双重索引。在我们的显式转换测试中,我们必须读取双索引,写入整数索引,然后在实际索引期间再次读取整数索引。所以matlab应该更快......为什么不呢?