24小时热门版块排行榜    

查看: 2482  |  回复: 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 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 让我中一个面上吧! +12 大萍1987 2026-08-20 15/750 2026-08-23 20:44 by 大萍1987
[基金申请] 2026年的国家社科基金项目通讯评审的新规则与新动向、新挑战 +4 process2012 2026-08-23 5/250 2026-08-23 19:58 by jurkat.1640
[基金申请] 什么时候开奖? +9 CrisMessi 2026-08-18 10/500 2026-08-23 12:03 by 丶昵称占用
[基金申请] 今天放榜吗? +15 布布和一二 2026-08-19 16/800 2026-08-23 09:55 by 张春生
[基金申请] 93BebMhtakh前后11位开头都是大写 +7 且听虎啸 2026-08-17 8/400 2026-08-22 21:55 by 医学老男孩
[基金申请] 人气不行了 +8 fansofjerry 2026-08-21 8/400 2026-08-22 16:30 by zyqchem
[基金申请] 放榜前的不淡定 40+4 snowwithsea 2026-08-19 14/700 2026-08-21 23:51 by cratir
[基金申请] 建议基金发布提前给出明确的时间点 +10 kulium 2026-08-21 13/650 2026-08-21 21:58 by alongwaytogo
[基金申请] 今日不放榜?网传国自然预计 8 月 27 日可查结果 +16 医学老男孩 2026-08-20 20/1000 2026-08-21 21:13 by Ldrop2023
[基金申请] 看来今天不会放榜了? +8 chengyan1220 2026-08-21 11/550 2026-08-21 17:52 by dcqxinyang
[基金申请] 感觉是下周放榜了 +7 angus9576 2026-08-17 12/600 2026-08-21 13:38 by weiyin
[基金申请] 我面上完蛋了 +7 且听虎啸 2026-08-20 8/400 2026-08-21 12:31 by 酷酷墨镜
[基金申请] 应该是下周三26日公布了吧? +4 哈哈蛤? 2026-08-21 4/200 2026-08-21 10:58 by Vivilian
[论文投稿] 投稿咨询 +5 wwm09 2026-08-17 7/350 2026-08-21 10:11 by 期刊论文帮手
[基金申请] 今天放榜没戏了吧 +9 yuleib84 2026-08-19 11/550 2026-08-21 10:06 by gltch
[基金申请] 估计是周四 +3 archvillain 2026-08-18 3/150 2026-08-21 01:48 by jnhyjjm
[基金申请] 重要消息,中午系统在维护 +11 yuleib84 2026-08-18 12/600 2026-08-20 11:09 by xskun
[基金申请] 朋友圈看到的 +6 wangzilk 2026-08-18 8/400 2026-08-19 10:55 by Haru815
[基金申请] 明天放榜? +5 Shxjjxjkx 2026-08-18 5/250 2026-08-18 18:14 by -大大大大大-
[基金申请] 今天维护系统维护 祝所有人 高中 +8 gjjjzhong 2026-08-18 9/450 2026-08-18 13:01 by 家与远方
信息提示
请填处理意见