線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1173
推到 Plurk!
推到 Facebook!

兩個小矩陣隨機貼到大矩陣的問題..?

答題得分者是:dllee
bvd
一般會員


發表:9
回覆:12
積分:4
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-06-12 11:24:10 IP:124.8.xxx.xxx 訂閱
各位好:小弟有一個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;jHeight;j )
for(int i=0;iWidth;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;jHeight;j )
for(int i=0;iWidth;j )
{
if(Image4->Canvas->Pixels[i][j]==RGB(0,0,0))
{
for(int k=0;k<64;k )
for(int y=0;yHeight;y )
for(int x=k*8;xWidth;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;yHeight;y )
for(int x=k*8;xWidth;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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-06-13 12:30:13 IP:61.62.xxx.xxx 未訂閱
您好:
雖然不太知道你程式的目的為何,不過有不少地方可以加快一些速度。
1. k*8改用(k << 3)
2. c0[x%8][y%8]*255/63改成c0[i & 7][j & 7] << 2
3.你的兩維陣列的空間是連續的,取值時可以用index遞增的手法,會比用c[x][y]取值少一個乘法...



dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-06-14 08:22:59 IP:59.105.xxx.xxx 訂閱
您主要的錯誤是在 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-06-14 10:35:11 IP:124.8.xxx.xxx 訂閱
真得非常感謝版大與副站長的指導,
我會先照著副站長所說的在紙上規劃好,
再來試著修改程式,如果有問題就麻煩再指正了^^|||
非常謝謝!!!
------
加強磨鍊
系統時間:2024-04-27 5:01:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!