奇怪的問題…不能用for,while迴圈… |
尚未結案
|
moonrise
一般會員 發表:7 回覆:7 積分:2 註冊:2003-10-05 發送簡訊給我 |
各位大大,問題是這樣的,其實就是很簡單的矩陣copy(a矩陣copy至b矩陣),不過請注意,二個二維矩陣的資料型態定義不同,
矩陣a為32bit,矩陣b為16bit,之前我就想過用memcpy的function,不過因為資料型態的不同,個人覺得不可行。
目的:將矩陣a的所有值copy至矩陣b,不過矩陣a元素高位元的lose可忽略。
條件限制:為加速code的速度,不可使用雙層for或while迴圈(PS:最多只能有一層)(最多n次)
main() { int a[10][10]; short b[10][10]; /*不可以的作法*/ for(int y=0;y<10;y ) for(int x=0;x<10;x ) b[y][x]=(short)a[y][x]; /*以上雙層for(或while)迴圈是不允許的*/ }想法:不知有沒有那種強制的型態轉換,將矩陣a轉為short的型態,再作memcpy,或使用pointer的方法來解決…(小小苦腦中…) 目前這個問題有解嗎?? |
khaupe
一般會員 發表:28 回覆:25 積分:15 註冊:2003-06-30 發送簡訊給我 |
引言: 各位大大,問題是這樣的,其實就是很簡單的矩陣copy(a矩陣copy至b矩陣),不過請注意,二個二維矩陣的資料型態定義不同, 矩陣a為32bit,矩陣b為16bit,之前我就想過用memcpy的function,不過因為資料型態的不同,個人覺得不可行。 目的:將矩陣a的所有值copy至矩陣b,不過矩陣a元素高位元的lose可忽略。 條件限制:為加速code的速度,不可使用雙層for或while迴圈(PS:最多只能有一層)(最多n次)不知你的情況能不能用一維陣列來寫二維陣列呢? 以上面為例 int a[10][10] 改成a[100] a[2][5] 改成 a[2 5*10] 不過這樣雖然只用一層迴圈 , 但也多了一些計算 而且也是一個個element做型態轉換..... ㄟ~~~算了 當我沒說main() { int a[10][10]; short b[10][10]; /*不可以的作法*/ for(int y=0;y<10;y ) for(int x=0;x<10;x ) b[y][x]=(short)a[y][x]; /*以上雙層for(或while)迴圈是不允許的*/ }想法:不知有沒有那種強制的型態轉換,將矩陣a轉為short的型態,再作memcpy,或使用pointer的方法來解決…(小小苦腦中…) 目前這個問題有解嗎?? |
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
引言: 各位大大,問題是這樣的,其實就是很簡單的矩陣copy(a矩陣copy至b矩陣),不過請注意,二個二維矩陣的資料型態定義不同, 矩陣a為32bit,矩陣b為16bit,之前我就想過用memcpy的function,不過因為資料型態的不同,個人覺得不可行。 目的:將矩陣a的所有值copy至矩陣b,不過矩陣a元素高位元的lose可忽略。 條件限制:為加速code的速度,不可使用雙層for或while迴圈(PS:最多只能有一層)(最多n次)moonrise你好: 雙層for迴圈不會比較慢吧?每個迴圈在一個loop只用到一個判斷運算和一個遞增運算。雙層迴圈要100次的loop,單層也要100次的loop,應該差不了多少? 反倒是用了二維矩陣,在每一次的取值都會花上一個乘法運算和一個加法運算。相對而言是不是慢很多? 所以統計下來,雙層的for總共花了100次的判斷、100次的遞增、100次的加法、100次的乘法、100次的強行轉換。能省的應該就是像khaupe提到的,將資料宣告成一維,就可以少了100次的乘法和加法運算。 不知道其他版友,有沒有什麼想法呢? 其實這個問題應該要請教版上的組語高手的… 發表人 - pwipwi 於 2004/05/19 10:29:29 |
stanley
一般會員 發表:9 回覆:36 積分:14 註冊:2003-11-20 發送簡訊給我 |
|
lu
高階會員 發表:11 回覆:189 積分:195 註冊:2003-11-19 發送簡訊給我 |
呵呵~~有趣的問題,偶來試著回答一下
像下面這樣的程式,如何? 基本上不管是幾為陣列,只要不是動態產生的,其記憶體必定為連續的
所以利用這種『特性』把2維陣列轉成一維陣列 試試看吧,希望對你有幫助 ^^
short aa[2][5]; long bb[2][5]={5}; short *ta = &(aa[0][0]); long *tb = &(bb[0][0]); for (int c=0;c<2;c ) for (int i=0;i<5;i ) { aa[c][i] = (c 1)*(i 1); } for (int c=0;c<2*5;c ) tb[c] = ta[c];========================= 大家一起快樂寫程式 |
jimmy_and_you
初階會員 發表:20 回覆:74 積分:33 註冊:2003-05-12 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |