gpt4 book ai didi

MATLAB:使用不同的索引列表多次选择向量中的元素

转载 作者:太空宇宙 更新时间:2023-11-03 20:07:29 24 4
gpt4 key购买 nike

INPUT:长度为n的逻辑行向量u,例如[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和conjunction的组合:

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.

Repmat/乘法

>> 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com