作者jatj ()
看板MATLAB
标题Re: [讨论] 如何不理输出就继续执行接下来的程式码?
时间Tue Oct 15 07:06:01 2013
首先 我不懂你所谓"不用等待"是什麽意思
因为就算你写成这样
b(1) = g(a(1));
for i = 2:n
a(i) = f(a(i-1));
b(i-1) = g(a(i-1));
end
b(n) = g(a(n));
这样跟你原本的运算时间会差不多
我想你的意思是算a(i)的时候也可以同时算b(i-1);
可是很遗憾这样的写法并不行 因为MATLAB会等到这行算完才算下一行
以下几个建议
因为很明显b的运算可以改为平行运算所以可以
1)用parfor (但请注意parfor的硬体限制以及overhead的问题), 或是
2)改写y=g(x)让g直接处理向量输入 并输出向量 (推荐)
至於f因为他仰赖上一个输入 所以没办法平行运算
所以不是这样
for i = 2:n
a(i) = f(a(i-1));
end
b = G(a);
就是
for i = 2:n
a(i) = f(a(i-1));
end
parfor i=1:n
b(i) = g(a(i));
end
大致这样
※ 引述《smarter1004 (请拒绝看各新闻台)》之铭言:
: 各位高手大家好
: 我想我还是换个方法问会比较清楚
: 我有两个函数f及g
: 它们的输入及输出皆为1 by 1的double
: n为一个正整数
: 程式码概略如下:
: a = zeros(1,n);
: b = zeros(1,n);
: a(1) = pi;
: for i = 2:n %回圈1
: a(i) = f(a(i-1));
: end
: for i = 1:n %回圈2
: b(i) = g(a(i));
: end
: 可以看到回圈2中b的计算并不需要全部的a(i)都算出来就能开始算了
: 但如果我把b的计算写进回圈1中 那下一个a的计算就要等b算出来才行
: 但f跟g所需的计算时间都相当久
: 而且都不会吃掉cpu全部的核心
: 所以我才在找寻方法让f跟g可以不用等待
: 用尽cpu所有的力气去跑
: 谢谢大家帮忙
: ※ 引述《smarter1004 (请拒绝看各新闻台)》之铭言:
: : 各位高手大家好
: : 现在我有两个函数f及g
: : a(1) = f(a(0)),
: : a(i+1) = f(a(i)),
: : b(i+1) = g(a(i)),
: : 其中i = 1,2,3,...
: : 可以看到f需要的变数只有a(i)
: : 而b(i)只是g输出的变数没有被拿来做其它事
: : 我的问题如下
: : g需要a才能算b
: : 但我不知道f什麽时候才会算出a来
: : 如果我在程式码中写了算出a(i)後叫g来算b(i+1)
: : 那f就只能等b(i+1)算出来後再算a(i+1)
: : 可是如前所提 f的变数并不需要b
: : 也就是会让f白等
: : 有什麽办法让matlab算出a後让电脑用其它核心去算b而f的部份继续呢?
: : 我的matlab没有平行运算工具箱
: : 谢谢大家帮忙
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 172.250.128.199
※ 编辑: jatj 来自: 172.250.128.199 (10/15 07:07)
※ 编辑: jatj 来自: 172.250.128.199 (10/15 07:09)