Re: [問題] for迴圈 處理矩陣問題

看板C_and_CPP作者 (ㄚ隆)時間14年前 (2010/04/28 00:02), 編輯推噓0(002)
留言2則, 1人參與, 最新討論串4/5 (看更多)
※ 引述《tyc5116 (累人啊....)》之銘言: : ※ 引述《powerjeffson (功夫熊)》之銘言: : : 遇到的問題: (題意請描述清楚) : : 假設我有一個A矩陣,大小為9*9 : : / \ / \ : : | 1 2 3 4 5 6 7 8 9 | | 5 5 5 8 8 8 2 2 2 | : : | 2 3 4 5 6 7 8 9 1 | | 5 5 5 8 8 8 2 2 2 | : : | 3 4 5 6 7 8 9 1 2 | | 5 5 5 8 8 8 2 2 2 | : : | 4 5 6 7 8 9 1 2 3 |    | 8 8 8 2 2 2 5 5 5 | : : A = | 5 6 7 8 9 1 2 3 4 | B = | 8 8 8 2 2 2 5 5 5 | : : | 6 7 8 9 1 2 3 4 5 | | 8 8 8 2 2 2 5 5 5 | : : | 7 8 9 1 2 3 4 5 6 | | 2 2 2 5 5 5 8 8 8 | : : | 8 9 1 2 3 4 5 6 7 | | 2 2 2 5 5 5 8 8 8 | : : | 9 1 2 3 4 5 6 7 8 | | 2 2 2 5 5 5 8 8 8 | : : \ / \ / : 將要取的元素存放在一個空間abc(1*9 array) : for (int i=0;i<9;++i){ : int index=0; : if (i%3==0) : index+=i; : for (int j=0;j<9;++j){ : if (j%3==0) : ++index; : B[i][j]=abc[index]; : } : } : 我是直接寫的啦,沒有真的程式去跑過,所以錯了就算了...XD : 如果是我的話,應該就是像這樣,迴圈加上判斷來寫吧... : 我覺得這是最直覺的方式 看到各位在這篇推文中貢獻自己的想法, 雖然應該解決了原po的問題, 尤其是 "B[i][j] = A[i/3*3+2][j/3*3+2];" 的推文, 一行就解決了, 不過還是覺得有改進方式, 雖然在腦中已經大概有想法, 但是最近雜務頗多, 今天終於花了大概15分鐘把想法實作出來了, 以下提供給原po"另一種"參考! (僅提供副程式部份) void MatrixTest(int M[9][9], int T[9][9]) { int i, j, x, y, s; for (i = 0; i < 9; i += 3) { x = i + 2; for (j = 0; j < 9; j += 3) { y = j + 2; s = M[x][y]; T[i][j] = T[i][j + 1] = T[i][j + 2] = s; T[i + 1][j] = T[i + 1][j + 1] = T[i + 1][j + 2] = s; T[i + 2][j] = T[i + 2][j + 1] = T[i + 2][j + 2] = s; } } } 以上這種作法雖然沒有一行那麼漂亮, 但是我會這麼做是有原因的! 因為這種解法不會用到乘法與除法, 僅用到加法而已, 而且只要再稍微整理一下, 可以輕鬆改成給 N x N 矩陣用的函式, 另外, 如果有人注意到我上面三行 " .... = s;" 的排列方式, 應該會有人看出端倪, 沒錯, 這裡可以再最佳化, 可以使用memcpy來處理, 這樣對 N x N 矩陣, N值本身大於一定值時, 效率就會大幅顯現出來! 以上, 個人拙見, 僅供參考! 歡迎指教! :) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.74.88.32

04/28 21:58, , 1F
寫錯還沒有人發現...用memcpy/memset最佳化還要做一些修
04/28 21:58, 1F

04/28 21:59, , 2F
改才有辦法...
04/28 21:59, 2F
文章代碼(AID): #1BrmgXD7 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BrmgXD7 (C_and_CPP)