我正在使用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
对我的目的是否合适?答案 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和逻辑索引解决方案有偏差吗?