• 回答数

    4

  • 浏览数

    2505

  • 收藏数

    0

作者:假装无所谓 发表于 2018-11-20 16:48:23
跳转到指定楼层
突然发现自己的程序中,对于矩阵选取某些列组成新的矩阵这一语句运行很慢。原本的程序初始矩阵M大小为64*40000,经过某种运算得到需要选取的列有5000个,现在需要从M中找到这5000列,并构成新的矩阵为后面运算使用。但是使用M(:,b)运行很慢。同时因为是嵌套在一个循环里的,循环大概次数是4000次左右,每次的M是固定的,但b是变化的。怎么可以加快速度


  1. <p>M=rand(64,40000);
  2. tic
  3. for i=1:4000</p><p>b= randperm(40000,5000);
  4. c=M(:,b);
  5. end
  6. toc
  7. 时间已过 14.141462 秒。</p>
复制代码



分享:
回复

使用道具

该用户从未签到

新手上路

Rank: 1

积分
46
极客币
113
主题
13
帖子
55
注册时间
2018-10-19
在线时间
2 小时
性别
保密
发表于 2018-11-20 16:49:01 | 显示全部楼层
你的循环程序就有问题,循环覆盖而不是循环赋值,运行一次就OK了
M=rand(64,40000);
b= randperm(40000,5000);
c=M(:,b);
回复

使用道具 举报

该用户从未签到

新手上路

Rank: 1

积分
40
极客币
102
主题
14
帖子
46
注册时间
2018-10-19
在线时间
2 小时
性别
保密
 楼主| 发表于 2018-11-20 16:49:17 | 显示全部楼层
浪者不回头 发表于 2018-11-20 16:49
你的循环程序就有问题,循环覆盖而不是循环赋值,运行一次就OK了
M=rand(64,40000);
b= randperm(40000,500 ...

是因为赋值只是循环里的一个部分,相当于每一个循环是针对一个新的元素的,在这个元素下,需要进行一次这样的赋值,需要对4000个不同的元素都进行这种赋值,每一次取出的列数是相同的,但具体的列是不固定的。因此,现在需要找到一种新的方式,使得赋值在整个循环中耗时降低
回复

使用道具 举报

该用户从未签到

新手上路

Rank: 1

积分
38
极客币
99
主题
13
帖子
42
注册时间
2018-10-19
在线时间
2 小时
性别
保密
发表于 2018-11-20 16:50:21 | 显示全部楼层
如果你的c在循环里面没有变化,就应该像楼上所说,在循环外赋值。
  1. d=M(:,b);
  2. for i=1:4000
  3. c=d*2;
  4. end
  5. toc
复制代码

这样后快得多



回复

使用道具 举报

该用户从未签到

新手上路

Rank: 1

积分
40
极客币
102
主题
14
帖子
46
注册时间
2018-10-19
在线时间
2 小时
性别
保密
 楼主| 发表于 2018-11-20 16:51:12 | 显示全部楼层

应该是我没表示清楚,M是固定的,每一次的b是变化的,针对每一个新的循环选择出新的c,所以不能进行循环外的赋值。
  1. M=rand(64,40000);
  2. tic
  3. for i=1:4000
  4. b= randperm(40000,5000);
  5. c=M(:,b);
  6. end
  7. toc
复制代码

我原本的程序如下,dic这个赋值在整个循环中占用的时间最多,怎么可以改进
  1. <p>for i=1:l %此处l为循环的次数4000
  2.     [minValue,col]=matchest(Wd,Wr(i,:),numd);
  3.     dcol=[col col+3969 col+3969*2 col+3969*3 col+3969*4 col+3969*5 col+3969*6 col+3969*7];%得到需要取出的列数
  4.     dic=DD(1:64,dcol);%在这个DD矩阵取出dcol,此处耗费较多时间,需要改进</p><p>    %[res,rcell]=HBOMPD(dic,signal(:,i),xishudu,fscund,xuhao);  %稀疏度设定为6,即非零元素最多为6个
  5.     %b(:,i)=res;
  6.     % Rcell(i)={rcell};
  7. end</p>
复制代码




回复

使用道具 举报

高级模式 评论
您需要登录后才可以回帖 登录 | 立即注册 微信登录