兩個小矩陣隨機貼到大矩陣的問題..? |
答題得分者是:dllee
|
bvd
一般會員 發表:9 回覆:12 積分:4 註冊:2006-10-31 發送簡訊給我 |
各位好:小弟有一個a[64][64],裡面的值不是0就是1,以亂數產生,之後再宣告2個矩陣:c0[8][8];c1[8][8],裡面的值為0~63,
再以c0[8][8]代表a[64][64]中的0;c1[8][8]代表a[64][64]中的1,去產生一個T[512][512],而T中c0與c1的排列方式,就如同a中 0與1的排列方式一樣,能否請大家指點...謝謝各位^^ 我自己寫了2個版,1st結果是錯的,2nd是要計算很久還沒有結果... int c0[8][8]={{51,27,6,46,59,12,54,7},{16,63,40,23,0,42,24,33}, {2,34,11,49,31,15,61,47},{55,26,53,17,57,38,5,21}, {10,43,4,41,8,28,52,39},{60,20,29,62,22,44,13,32}, {1,48,36,9,50,3,58,25},{35,14,56,18,30,37,19,45}};//dither cell0; int c1[8][8]={{17,57,38,5,21,55,26,53},{41,8,28,52,39,10,43,4}, {62,22,44,13,32,60,20,29},{9,50,3,58,25,1,48,36}, {18,30,37,19,45,35,14,56},{6,46,59,12,54,7,51,27}, {40,23,0,42,24,33,16,63},{11,49,31,15,61,47,2,34}};//dither cell1; 1st: /*for(int j=0;j for(int i=0;i { if(Image4->Canvas->Pixels[id][jd]==RGB(0,0,0)) Image5->Canvas->Pixels[i][j]=RGB(c0[i%8][j%8]*255/63, c0[i%8][j%8]*255/63, c0[i%8][j%8]*255/63); else Image5->Canvas->Pixels[i][j]=RGB(c1[i%8][j%8]*255/63, c1[i%8][j%8]*255/63, c1[i%8][j%8]*255/63); }*/ ----------------------------------------------------------------------------------------- 2nd: for(int j=0;j for(int i=0;i { if(Image4->Canvas->Pixels[i][j]==RGB(0,0,0)) { for(int k=0;k<64;k ) for(int y=0;y for(int x=k*8;x Image5->Canvas->Pixels[x][y]=RGB(c0[x%8][y%8]*255/63, c0[x%8][y%8]*255/63, c0[x%8][y%8]*255/63); } else { for (int k=0;k<64;k ) for(int y=0;y for(int x=k*8;x Image5->Canvas->Pixels[x][y]=RGB(c1[x%8][y%8]*255/63, c1[x%8][y%8]*255/63, c1[x%8][y%8]*255/63); } }
------
加強磨鍊 |
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
您主要的錯誤是在 for 迴圈, 不論第1或第2都一樣。
for(int i=0;iWidth;j ) 只要 iWidth 不是 0,它就是無窮迴圈,一定跑不完。 for(int i=0;i < iWidth ; i ) 如上,i 才會讓迴圈跑指定的圈數。 再來,看您的程式,Image4 應該是 a[64][64], Image5 是希望最後的產出 T[512][512]。 寫程式時,不是迴圈,指標任意試試看會不會 work,應該要先紙上作業,以本例來說 來源是 Image4 也就是 a[64][64] 目標是 Image5 T[512][512] 每個 a[i][j] 變成一個 cX[8][8] 填入 T[512][512] 可先試算如下: a[0][0] 要填入 T 的起始位置在 T[0][0] a[1][0] 要填入 T 的起始位置在 T[8][0] a[2][0] 要填入 T 的起始位置在 T[16][0] ... a[0][1] 要填入 T 的起始位置在 T[0][8] a[0][2] 要填入 T 的起始位置在 T[0][16] ... 歸納 a[i][j] 要填入 T 的起始位置在 T[i*8][j*8] 起始位置確定了,再來是填入 c0[8][8] 或 c1[8][8] 以 T 起始位置是 T[i*8][j*8] 填入 c0[8][8] 為例: c0[0][0] 填入 T 的位置是 T[i*8 0][j*8 0] c0[1][0] 填入 T 的位置是 T[i*8 1][j*8 0] c0[2][0] 填入 T 的位置是 T[i*8 2][j*8 0] ... c0[0][1] 填入 T 的位置是 T[i*8 0][j*8 1] c0[0][2] 填入 T 的位置是 T[i*8 0][j*8 2] ... 歸納 c0[m][n] 要填入 T 的起始位置在 T[i*8 m][j*8 n] 如此,就是需要 4 層迴圈, i,j,m,n 來規劃試算後,再來才是寫程式。 等到迴圈寫熟了,自然就不需要那麼麻煩,可以很快的想出並實作, 但對於初學者來說,如果這種基本功沒作,有時程式只是矇對, 寫了半天還是不知道在寫什麼。 請使用上述的方式改一下您的程式吧,如果有問題,再提出。 如果您是新手,建議不要太在意程式的最佳化,先學如何把程式寫對, 等入門基本的大部份都沒有問題了,再來學學最佳化。 像 pwipwi 版主所提的最佳化,真的可以讓程式加快很多喔,可是如果 基本功都沒作好,可能連自己都看不懂自己在寫什麼。
------
http://www.ViewMove.com
編輯記錄
dllee 重新編輯於 2007-06-14 08:24:15, 註解 無‧
|
bvd
一般會員 發表:9 回覆:12 積分:4 註冊:2006-10-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |