'find'命令替代索引

时间:2014-10-15 07:39:06

标签: matlab mask

我正在使用Matlab R2013b。 在我的脚本中,我使用find来获取布尔掩码为1的位置,然后应用该掩码来更改另一个向量中的值vu例如:

bMask = [1,1,0,0,0,1,0,1];
vIdx = find(bMask==1);
u(vIdx) = 0;

现在,Matlab在编辑器中发出警告声称" 要提高性能,请使用逻辑索引而不是 find"并建议进行以下更改:

vIdx = bMask == 1;

但是,这与find的解决方案无法达成相同的效果。

所以这里(是)是我的问题:

  • 我是否应该完全关注此警告(考虑到bMask可能有尺寸> 100),或find对我的目的是否合适?
  • 如果是这样,实现这种掩蔽的有效替代方法是什么?

2 个答案:

答案 0 :(得分:3)

是的,您应该遵循MATLAB的建议。你可以使用这样的逻辑掩码:

u(bMask) = 0;

如果bMask不是逻辑掩码,则更强大的方法是:

u(logical(bMask)) = 0;

这比使用find更快,因为MATLAB不必搜索向量并创建索引向量。

快速性能检查:

a = rand(100000,1);                 %// Example vector
b = logical(randi(2,100000,1)-1);   %// Logical mask with 1's and 0s

c = a;  %// Backup of a

for ii = 1:1000
    tic; t = toc;   %// Warm up tic/toc function
end

tic
for ii = 1:1000
    a(b) = 0;            %// Perform operation using logical mask
end
t1 = toc

a_temp = a;
a = c;
tic
for ii = 1:1000
    idx = find(b == 1); %// Perform operation using find
    a(idx) = 0;
end
t2 = toc

isequal(a_temp, a)

t1 =
    0.8780  %// Logical mask
t2 =
    1.6748  %// Using find
ans =
     1

答案 1 :(得分:0)

逻辑索引通常应该比使用find更快。 find为您提供索引的位置,您也可以使用逻辑掩码。结果应该是一样的。

bMask = [1,1,0,0,0,1,0,1];
u = rand(size(bMask));
u2 = u;

% find method
vIdx = find(bMask==1);
u(vIdx) = 0;

% logical indexing method
vIdx = bMask == 1
u2(vIdx) = 0;

% check for deviations in result:
all(u==u2) % True

因为它返回true,所以两种方式都返回相同的结果。您能提供一个示例,其中find-solution和逻辑索引解决方案有偏差吗?