24小时热门版块排行榜    

查看: 2508  |  回复: 15

myw052

金虫 (正式写手)

博士

[求助] matlab for循环速度 提高方法

下面的程序是我用matlab写的一个程序,程序中需要用到for循环,由于是高位矩阵,在运行的时候循环速度效率很低,造成计算成本很大。在许多论坛上寻找好的方法来解决matlab运行中循环的速度提高方法,始终没有找到。有人说用矢量化解决问题,但是描述的不具体,操作起来有困难。有人说用“少拿多取”的思想,但是在简单情况下,可以理解,像如下的情况,似乎难以实行。

故在本版发帖,希望斑竹或者各位程序达人能出来指点一二。本人不胜感激。
(注:此贴绝不是无病呻吟)。

function for_cycle()
tic
clc
clear
close all
beta=rand(10^5,10,10);
gama=rand(10^5,10,10);

[Row,Column,Volume]=size(beta);
gama_u=rand(1,1);
m=2;

for k=1:Volume                     
    k
    for i=1:Row                    
        for j=1:Column               
            D(i,j,k)=beta(i,j,k)/(beta(i,j,k)+(1-beta(i,j,k))*(gama(i,j,k)-(gama(i,j,k)/gama_u)^m)/(gama(i,j,k)-1));
        end
    end
end

D
toc
end
回复此楼
天天快乐
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
xzhdty: 金币+1, 欢迎常来 2012-04-24 13:54:50
myw052: 金币+7, ★★★★★最佳答案, 您的程序写的很好,矢量化确实很厉害。 2012-04-24 18:52:29
把规模改小了,方便对比测试
CODE:
tic
clc
clear
close all
beta=rand(10,10,10);
gama=rand(10,10,10);

[Row,Column,Volume]=size(beta);
gama_u=rand(1,1);
m=2;

D=zeros(size(beta));

for k=1:Volume                    
    for i=1:Row                    
        for j=1:Column               
            D(i,j,k)=beta(i,j,k)/(beta(i,j,k)+(1-beta(i,j,k))*(gama(i,j,k)-(gama(i,j,k)/gama_u)^m)/(gama(i,j,k)-1));
        end
    end
end

D
toc

tic
D_vectorized = beta ./ ( beta + (ones(size(beta)) - beta) .* (gama-(gama/gama_u).^m) ./ (gama - ones(size(gama))) )
toc

2楼2012-04-24 10:42:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

这就是传说中的矢量化
3楼2012-04-24 10:43:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lijie169

铜虫 (著名写手)

【答案】应助回帖


感谢参与,应助指数 +1
myw052: 金币+1, 嗯,这个道理我还是懂的。只是对于高维数组有时候想要实现比较麻烦。 2012-04-24 18:56:50
matlab上说 矩阵运算比for循环高效很多
4楼2012-04-24 12:24:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhfzh

木虫 (正式写手)

你拭下用矢量化计算
就是把for,end去了,常数乘个同维度的单位阵,所有的乘除号前加点
还有你算beta,gamma的时候不要重复调用,用个临时变量存起来
还慢的话你用C语言写吧
5楼2012-04-24 12:31:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhfzh

木虫 (正式写手)

【答案】应助回帖


感谢参与,应助指数 +1
myw052: 金币+1 2012-04-24 18:56:17
你拭下用矢量化计算
就是把for,end去了,常数乘个同维度的单位阵,所有的乘除号前加点
还有你算beta,gamma的时候不要重复调用,用个临时变量存起来
还慢的话你用C语言写吧
6楼2012-04-24 12:32:12
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lurencyj

木虫 (著名写手)

【答案】应助回帖


感谢参与,应助指数 +1
myw052: 金币+1, 感谢您的帮助。 2012-04-24 18:57:04
楼主可以尝试使用matlab里面的冒号。可以极大的提高程序的效率,避免低效的for和while循环。
很女子很弓虽大
7楼2012-04-24 16:41:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

myw052

金虫 (正式写手)

博士

引用回帖:
7楼: Originally posted by lurencyj at 2012-04-24 16:41:34:
楼主可以尝试使用matlab里面的冒号。可以极大的提高程序的效率,避免低效的for和while循环。

我的理解,冒号操作,只是产生数组。譬如N=-1:0.1:1
能避免for循环么?
lurencyj能否给一个小例子验证下。。。
天天快乐
8楼2012-04-24 18:55:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

myw052

金虫 (正式写手)

博士

引用回帖:
6楼: Originally posted by zhfzh at 2012-04-24 12:32:12:
你拭下用矢量化计算
就是把for,end去了,常数乘个同维度的单位阵,所有的乘除号前加点
还有你算beta,gamma的时候不要重复调用,用个临时变量存起来
还慢的话你用C语言写吧

嗯,你的方法跟前面sudo说的一样。C很久不用了,生疏了。
天天快乐
9楼2012-04-24 18:56:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lurencyj

木虫 (著名写手)

【答案】应助回帖

CODE:
A = rand(4,4);

B = ones(4,1);

B(:) = sin(A(:,1))

B(:) = sin(A(:,2))

[ 发自手机版 http://muchong.com/3g ]
很女子很弓虽大
10楼2012-04-24 19:15:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 myw052 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[博后之家] 售SCI一区T0P文章,我:8.O.55.1.O54,科目全,可伽急 +3 G6APbkg8SA6w 2026-08-29 5/250 2026-08-31 01:51 by hZiFeudZyoGR
[考研] 售SCI一区T0P文章,我:8.O.55.1.O.54,科目齐全,可+急 +4 gy1nBQXYQJqL 2026-08-29 5/250 2026-08-31 01:27 by hZiFeudZyoGR
[博后之家] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +7 gy1nBQXYQJqL 2026-08-29 9/450 2026-08-31 01:15 by hZiFeudZyoGR
[博后之家] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +6 gy1nBQXYQJqL 2026-08-29 9/450 2026-08-31 01:05 by hZiFeudZyoGR
[论文投稿] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +6 gy1nBQXYQJqL 2026-08-29 8/400 2026-08-31 00:54 by hZiFeudZyoGR
[考研] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +7 ASdOkHsho7FD 2026-08-28 11/550 2026-08-31 00:32 by hZiFeudZyoGR
[硕博家园] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +7 ASdOkHsho7FD 2026-08-28 12/600 2026-08-31 00:31 by hZiFeudZyoGR
[考博] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +4 ASdOkHsho7FD 2026-08-28 7/350 2026-08-31 00:21 by hZiFeudZyoGR
[基金申请] 国社科又开始会评了,不知道这次命运如何 +5 雨打竹帘 2026-08-30 9/450 2026-08-30 22:23 by 余韵清
[考博] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +3 jCd0dEvKHShX 2026-08-29 6/300 2026-08-30 19:13 by hZiFeudZyoGR
[论文投稿] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +6 ASdOkHsho7FD 2026-08-28 7/350 2026-08-30 17:03 by hZiFeudZyoGR
[基金申请] 面上意见出来了 +9 黄鸟于飞Chao 2026-08-29 18/900 2026-08-30 16:47 by 黄鸟于飞Chao
[找工作] 售SCI一区T0P文章,我:8O.55.1.O.54,科目全,可伽急 +4 gy1nBQXYQJqL 2026-08-29 8/400 2026-08-30 12:03 by l0VvVHGBGRLv
[基金申请] 29号明天会评吗 +3 笨笨唐 2026-08-28 3/150 2026-08-30 09:29 by cww8181
[基金申请] 申请删除本帖 +6 lyz123lyz 2026-08-27 7/350 2026-08-27 17:31 by 宁静致远sy
[基金申请] 2026年8月25日国自然放榜前突然收到列入评审专家邮件,有关系吗? +25 木水思豆 2026-08-25 28/1400 2026-08-26 14:53 by draco1987
[基金申请] 为什么国自然不能直接公布 +4 bjdxyxy 2026-08-26 4/200 2026-08-26 13:12 by qingmu1201
[基金申请] 国际合作可查了,中了面上 (EPI+1)(金币+50) +18 Ldrop2023 2026-08-26 18/900 2026-08-26 11:15 by cmrandy
[基金申请] 国合可查了 +3 paperzjh 2026-08-26 3/150 2026-08-26 10:41 by LemmonTr
[基金申请] 在坚冰还盖着北海的时候,我看到了怒放的梅花。 (金币+10) +6 ziyangfang 2026-08-25 9/450 2026-08-25 20:26 by huagongfeihu
信息提示
请填处理意见