[問題] 矩陣點乘(.*)和for迴圈處理 結果不一樣?已回收

看板MATLAB作者 (@@")時間15年前 (2009/07/03 15:12), 編輯推噓3(307)
留言10則, 4人參與, 最新討論串1/1
各位大大好~ 有個問題困惑在下有段時間 一直看不出所以然來~ 想請各位大大解惑也~ 問題是這樣子的 問題敘述: ===================================================== 在0.017到0.027之間~我要分1312個點~代入一個式子裡面 去算出相對應的值! 結果發現我使用矩陣點乘出來的結果,和我用for迴圈跑出來的結果竟然不一樣@@" **由於代入的式子是會讓結果遞增的..也就是說0.027代進去會是最大值 當第一個0.017代進式子算出來的結果,和for迴圈跑的結果是一樣的~最小值都是1082 (最小值都一樣,沒有問題) 但是當最後一個0.027代入式子之後, (1) 用矩陣點乘,最大值是3869 (2) 用for迴圈跑出來,最大值卻是3134 (3) 最後嘗試用linspace直接平均分配0.017~0.027之間有1312個點 linspace(0.017,0.027,1312),跑出來的結果最大值是4046 ======================================================== 三種情況都不一樣T_T...怎摸會這樣子... 程式的解說如下: ======================================================== 1312個點並不是平均分配~故無法使用linspace來分~ 程式一開始我先分配1312個點,再把他集合起來變成一個矩陣 dist1=linspace(0.017,0.018,83); dist2=linspace(0.018,0.019,123); dist3=linspace(0.019,0.020,82); dist4=linspace(0.020,0.021,82); dist5=linspace(0.021,0.022,163); dist6=linspace(0.022,0.023,164); dist7=linspace(0.023,0.024,123); dist8=linspace(0.024,0.025,82); dist9=linspace(0.025,0.026,164); dist10=linspace(0.026,0.027,246); dist=[dist1 dist2 dist3 dist4 dist5 dist6 dist7 dist8 dist9 dist10]; 接下來是一些參數設定~在此我就不打出來~ 接下來是我試的三種方法 % ===================version 1=================== X=dist; model=(1/R^2)*(mu0*(N^4)*S/8/m)*(((X+L).*log((r2+sqrt((r2^2)+(X+L).^2))/ (r1+sqrt((r1^2)+(X+L).^2)))+X.*log((r1+sqrt((r1^2)+X.^2))/ (r2+sqrt((r2^2)+X.^2)))).^2-((X+delta_X+L).*log((r2+sqrt((r2^2)+ (X+delta_X+L).^2))/(r1+sqrt((r1^2)+(X+delta_X+L).^2)))+ (X+delta_X).*log((r1+sqrt((r1^2)+(X+delta_X).^2))/ (r2+sqrt((r2^2)+(X+delta_X).^2)))).^2); model=fix(1./model.*1000); plot(X,model) max(model) % max = 3869 min(model) % ===================version 1=================== % ===================version 2 (for迴圈)=================== MODEL=[]; x=[]; for a=1:1:1312 X=dist(a); model=(1/R^2)*(mu0*(N^4)*S/8/m)*(((X+L)*log((r2+sqrt((r2^2)+(X+L)^2))/ (r1+sqrt((r1^2)+(X+L)^2)))+X*log((r1+sqrt((r1^2)+X^2))/ (r2+sqrt((r2^2)+X^2))))^2-((X+delta_X+L)*log((r2+sqrt((r2^2)+ (X+delta_X+L)^2))/(r1+sqrt((r1^2)+(X+delta_X+L)^2)))+ (X+delta_X)*log((r1+sqrt((r1^2)+(X+delta_X)^2))/ (r2+sqrt((r2^2)+(X+delta_X)^2))))^2); MODEL=[MODEL model]; x=[x X]; end MODEL_new=fix(1./MODEL*1000); plot(x,MODEL_new); max(MODEL_new) % max = 3134 min(MODEL_new) % ===================version 2=================== 方法一和二都是使用自行建造的dist~ 下面的方法三就是直接使用linspace % ===================version 3 (矩陣點乘)=================== X=linspace(0.017,0.027,1312); model=(1/R^2)*(mu0*(N^4)*S/8/m)*(((X+L).*log((r2+sqrt((r2^2)+(X+L).^2))/ (r1+sqrt((r1^2)+(X+L).^2)))+X.*log((r1+sqrt((r1^2)+X.^2))/ (r2+sqrt((r2^2)+X.^2)))).^2-((X+delta_X+L).*log((r2+sqrt((r2^2)+ (X+delta_X+L).^2))/(r1+sqrt((r1^2)+(X+delta_X+L).^2)))+ (X+delta_X).*log((r1+sqrt((r1^2)+(X+delta_X).^2))/ (r2+sqrt((r2^2)+(X+delta_X).^2)))).^2); model=fix(1./model.*1000); plot(X,model) max(model) % max = 4046 min(model) % ===================version 3=================== 最後自己也試了使用0.027直接代入model和下面fix那式子 結果和for迴圈的情況一樣~最大值為3134 想請問的是 1.為什麼會出現這樣子的差別呢?? 2.是否使用for迴圈算出來的才是正確的值呢@@? 3.為何矩陣點乘會出現這樣子的情況@@?不是應該和for迴圈一樣才對@@? 最後附上程式碼 http://www.badongo.com/file/15809350 挨~弄了好一陣子~目前都不知道為何T_T 很感謝各位大大的協助~ 小弟錢不是很多~ 但是願意出1000p給解決問題的大大 再次感謝各位!! 謝謝!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.138.176.166

07/03 16:13, , 1F
MODEL=[MODEL model]; MODEL_new=fix(1./MODEL*1000)
07/03 16:13, 1F

07/03 16:13, , 2F
MODEL_new 會一直被取代吧?
07/03 16:13, 2F

07/03 16:16, , 3F
噗噗..oops...大大您說的沒錯..那一行應該是在for外面
07/03 16:16, 3F
※ 編輯: gmpalex 來自: 140.138.176.166 (07/03 16:29)

07/03 16:29, , 4F
s大大~我修改好了~因為每次都會覆蓋~還是會紀錄到最後一次
07/03 16:29, 4F

07/03 16:30, , 5F
但還是不知道為何結果會不一樣T_T
07/03 16:30, 5F

07/04 00:26, , 6F
用STEP一步一步看吧
07/04 00:26, 6F

07/06 08:34, , 7F
T_T...這實在太奇怪啦~
07/06 08:34, 7F

07/06 10:03, , 8F
問題不在.* 問題在要用./ 矩陣直接下去除出來是scale
07/06 10:03, 8F

07/08 18:33, , 9F
哇~~~我的除法真的忘了加.了啦= =..應該是./才對~
07/08 18:33, 9F

07/08 18:33, , 10F
真的超感謝panzertp大大!! 1000p就頒給panzertp大大嚕!3Q!
07/08 18:33, 10F
文章代碼(AID): #1AJQzGiw (MATLAB)