目前我能提供的最快速度是4秒(在我的机器上)。我不确定你是否尝试过这个,但无论如何,这里有一个解决方案。
我有一个名为
randbool.m
的m文件,其中包含生成测试数据的内容。
function x = randbool(m,n)
x = logical(rand(m,n) < 0.5);
生成测试数据:
>> u = randbool(1,20000);
>> M = randbool(30,20000);
我可以想到三种方法来循环遍历M的行(使用
bsxfun
,使用
repmat
,使用循环),以及两种提取所需元素的方法(使用连接符
&
或使用点乘法
.*
)。最快的方法是将
bsxfun
和连接符结合起来使用:
Bsxfun / conjunction
>> tic, for i=1:1000, bsxfun(@and,u,M)
Elapsed time is 4.068684 seconds.
Bsxfun / 乘法
>> tic, for i=1:1000, bsxfun(@times,u,M)
Elapsed time is 4.856784 seconds.
Repmat / 连接
>> tic, for i=1:1000, utmp=repmat(u,30,1)
Elapsed time is 7.305158 seconds.
Repmat / 乘法
>> tic, for i=1:1000, utmp=repmat(u,30,1)
Elapsed time is 8.117164 seconds.
循环/连接
>> tic, for i=1:1000, for j = 1:30, out(j,:)=u&M(j,:); end; end, toc
Elapsed time is 7.110872 seconds.
循环/乘法
>> tic, for i=1:1000, for j = 1:30, out(j,:)=u.*M(j,:); end; end, toc
Elapsed time is 8.322888 seconds.
n
的大小和选择器u
的稀疏程度,你得到的逻辑数组将主要是零,有许多行完全为零。你能否重新构思问题以利用这一点?你是否正在使用M
来索引数据数组? - nicktruesdale