输入:长度为 u
的逻辑行向量 n
,比如 [1,0,1,1,0]
;和一个大小为 m×n 的逻辑矩阵 M
,比如 [1,0,0,1,1;0 0 0 1 1]
。
OUTPUT:大小为 m×n 的逻辑矩阵,第一行是将矩阵 M
的第一行作为“选择器”,即 [1,0,0,1,0];
,第二行同样是 [0 0 0 1 0]
。
行向量的长度为 20000,矩阵的长度为 30×20000。这将重复 1000 次,我希望某些东西的成本低于 1 秒。
我尝试过 repmat
、 bsxfun
和元素乘法,但没有成功。猜猜有一种简单的方法可以一次“选择”这些元素,因为它们都是逻辑值。
最佳答案
目前我可以给你的最快速度是 4 秒(在我的机器上)。我不是 100% 确定你是否尝试过这个,但无论如何你都可以。
我有一个包含这些内容的 m 文件 randbool.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
和joint的组合:Bsxfun/连词
>> tic, for i=1:1000, bsxfun(@and,u,M); end, toc
Elapsed time is 4.068684 seconds.
Bsxfun/乘法
>> tic, for i=1:1000, bsxfun(@times,u,M); end, toc
Elapsed time is 4.856784 seconds.
Repmat/连词
>> tic, for i=1:1000, utmp=repmat(u,30,1); M&utmp; end, toc
Elapsed time is 7.305158 seconds.
重复/乘法
>> tic, for i=1:1000, utmp=repmat(u,30,1); M.*utmp; end, toc
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.
关于MATLAB:使用不同的索引列表多次选择向量中的元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13643689/