Re: [討論] 如何不理輸出就繼續執行接下來的程式碼?

看板MATLAB作者時間12年前 (2013/10/15 07:06), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/4 (看更多)
首先 我不懂你所謂"不用等待"是什麼意思 因為就算你寫成這樣 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)
文章代碼(AID): #1IN7ZSOc (MATLAB)
討論串 (同標題文章)
文章代碼(AID): #1IN7ZSOc (MATLAB)