Re: [問題] 一段覺得很怪的code已回收

看板MATLAB作者 (juzn)時間15年前 (2010/05/20 15:07), 編輯推噓8(8022)
留言30則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《hanjing (自知者明)》之銘言: : dat為n*k的矩陣 : n=length(dat(:,1)); (定義n) : q=dat(:,qi); (定義q) : % Sorted index of q % : qs=0; (第一個迴圈的起始值) : for i=1:length(q) (我覺得這行是多餘的) 因為迴圈裡面還是有使用到i所以不能拿掉 : for i_=1:length(q) (第一個迴圈開始) 怕搞混可以把i_改成其他變數例如:ii kk等等 : temp=0; (第二個迴圈的起始值) : for j=1:length(q) (第二個迴圈開始) : if (q(i_)>q(j))|(i_>=j&q(i_)==q(j)) (?1) 這是說 如果 q(i_)>q(j)或是(i_大於等於j且q(i_)等於q(j))時 q(j)這寫法表q資料裡面的第j個element : temp=temp+1; (第二個迴圈的規則) 設定此時的temp值 : end; (第二個迴圈結束) : end; : if temp==i (?2) 根據上面迴圈計算出的temp值 如果等於 i 執行下面的運算 (就是跟最外面的迴圈數等值時) : qs=[qs;i_]; (?3) 此時qs存成[qs;i_]的陣列 這是為了紀錄下此時的i_值 就是temp==i這件事發生時 資料的位置 用這樣寫法會把每一次符合條件下的新i_值放到qs資料矩陣中的下一筆 而不會去覆蓋到前面已經存好的資料 : end;(把end移到這個位置比較不會搞錯在哪一個迴圈層) : end; : end; : qs=qs(2:length(qs)); (?4) 把qs中第一筆資料拿掉(因為第一筆資料是起始值0) : q=q(qs); (?5) 根據計算出的qs 來抓出q的資料 ( qs此時是q的index) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 134.208.0.181 ※ 編輯: juzn 來自: 134.208.0.181 (05/20 15:09)

05/20 16:55, , 1F
先感謝您的回答,最後兩行我還是有疑問要再想一下,感謝您了
05/20 16:55, 1F

05/20 17:00, , 2F
你把用小筆資料去驗證 把最後兩行改 qs1= 跟 q1=
05/20 17:00, 2F

05/20 17:01, , 3F
然後跟qs 還有q 比較一下資料
05/20 17:01, 3F
※ 編輯: juzn 來自: 134.208.0.181 (05/20 17:03) ※ 編輯: juzn 來自: 134.208.0.181 (05/20 17:06)

05/20 17:20, , 4F
不好意思,我想再問一下,一開始的qs=0是和下方的qs=[qs;i_]
05/20 17:20, 4F

05/20 17:21, , 5F
做對應嗎,還是說一開始的qs只是代表迴圈開始而已,因為我有
05/20 17:21, 5F

05/20 17:22, , 6F
點被qs搞混了,有點不太了解qs到底是什麼東西,感謝
05/20 17:22, 6F
恩 一開始給的值是qs=0 此時是 1*1的資料矩陣 然後temp==i的時候 因為qs=[qs;i_] 所以資料變成 qs=[0;i_] 當第二次條件成立時 qs=[0;i_(第一次的);i_(第二次的)]以此類推 目的就是使儲存i_不會去覆蓋到上一筆資料 ※ 編輯: juzn 來自: 134.208.0.181 (05/20 17:31)

05/20 17:32, , 7F
我剛照您的意思先用小筆資料測試,qs=[1 2 3;4 5 6;7 8 9]
05/20 17:32, 7F
我表達的不好,我是要說先給個小筆dat 例如:dat=[1 4 7;2 5 8;3 6 9]; 然後讓qi=1~3中隨意常數做測試

05/20 17:33, , 8F
qs1=qs(2:length(qs)); qs1=4 7 但是若打q1=q(qs)時卻
05/20 17:33, 8F

05/20 17:34, , 9F
出現 Undefined command/function 'q'
05/20 17:34, 9F

05/20 17:36, , 10F
嗯qs會變成什麼我大概了解了,不過之後的
05/20 17:36, 10F

05/20 17:37, , 11F
q1=q(qs1); 不過出線的訊息是說你沒定義q
05/20 17:37, 11F

05/20 17:37, , 12F
qs=qs(2:length(qs))其實是針對temp=i成立所做的動作是嗎
05/20 17:37, 12F

05/20 17:40, , 13F
哦~那應該沒錯,因為原始的CODE是有定義q=dat(:.qi)
05/20 17:40, 13F

05/20 17:41, , 14F
是的qs那行的目的就是要把初始給定的0給拿掉
05/20 17:41, 14F

05/20 17:42, , 15F
所以我也應該必需用設小資料q=[1 2;3 4;5 6]才行對嗎
05/20 17:42, 15F

05/20 17:43, , 16F
要給qs=0不是要說迴圈開始 而是為了qs=[qs;i_]時qs第一次執行
05/20 17:43, 16F

05/20 17:43, , 17F
必須有定義y
05/20 17:43, 17F

05/20 17:45, , 18F
不用阿 就q=dat(:,qi) qi隨便給個沒超過矩陣大小的常數
05/20 17:45, 18F

05/20 17:47, , 19F
對~只是我還沒load dat進去,所以如果只是測試一下的話,就~
05/20 17:47, 19F
※ 編輯: juzn 來自: 134.208.0.181 (05/20 17:50)

05/20 17:48, , 20F
還是要設定一個q才能得到q1=q(qs1)是什麼
05/20 17:48, 20F

05/20 17:50, , 21F
您方才說qs=0是為了qs=[qs;i_]時能有所動作才設定qs=0是嗎
05/20 17:50, 21F

05/20 17:51, , 22F
是的 以目前成是來說 你不設0 設100也不會有影響
05/20 17:51, 22F

05/20 17:52, , 23F
我想問一下,您都參考哪本matlab書籍,感謝
05/20 17:52, 23F

05/20 17:52, , 24F
程式
05/20 17:52, 24F

05/20 17:54, , 25F
8年前看張智星老師的MATLAB程式設計與應用 然後都翻HELP
05/20 17:54, 25F

05/20 20:17, , 26F
所以我PO出來的CODE您可以了解是因為經驗累積囉~
05/20 20:17, 26F

05/20 20:20, , 27F
也不是 你的程式並不複雜 我也沒很厲害 只會基本應用而已
05/20 20:20, 27F

05/20 20:23, , 28F
從你的文章看得出你應該會寫C 會難以理解另外一種程式語言
05/20 20:23, 28F

05/20 20:24, , 29F
我並不意外 我也是這樣走過來的 多練習多看書自然就熟悉了
05/20 20:24, 29F

05/20 23:33, , 30F
總之,非常感謝您的幫忙
05/20 23:33, 30F
文章代碼(AID): #1BzD-iQd (MATLAB)
文章代碼(AID): #1BzD-iQd (MATLAB)