输入:长度为 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 秒。

我尝试过 repmatbsxfun 和元素乘法,但没有成功。猜猜有一种简单的方法可以一次“选择”这些元素,因为它们都是逻辑值。

最佳答案

目前我可以给你的最快速度是 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/

10-12 16:42