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

奇怪的問題…不能用for,while迴圈…

尚未結案
moonrise
一般會員


發表:7
回覆:7
積分:2
註冊:2003-10-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-18 23:54:19 IP:61.229.xxx.xxx 未訂閱
各位大大,問題是這樣的,其實就是很簡單的矩陣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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-19 07:13:24 IP:61.231.xxx.xxx 未訂閱
引言: 各位大大,問題是這樣的,其實就是很簡單的矩陣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的方法來解決…(小小苦腦中…) 目前這個問題有解嗎??
不知你的情況能不能用一維陣列來寫二維陣列呢? 以上面為例 int a[10][10] 改成a[100] a[2][5] 改成 a[2 5*10] 不過這樣雖然只用一層迴圈 , 但也多了一些計算 而且也是一個個element做型態轉換..... ㄟ~~~算了 當我沒說
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-19 10:24:24 IP:211.76.xxx.xxx 未訂閱
引言: 各位大大,問題是這樣的,其實就是很簡單的矩陣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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-19 10:58:40 IP:61.219.xxx.xxx 未訂閱
試試這個:  
 
main()
{
    int a[10][10];
    short b[10][10];
    int *pa;
    short *pb;
    pa = &a[0][0];
    pb = &b[0][0];
    for(int i=0; i<100; i  )
        *(pb i) = *(pa i);
}
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-19 11:02:46 IP:221.169.xxx.xxx 未訂閱
呵呵~~有趣的問題,偶來試著回答一下 像下面這樣的程式,如何?    基本上不管是幾為陣列,只要不是動態產生的,其記憶體必定為連續的 所以利用這種『特性』把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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-19 14:13:14 IP:61.70.xxx.xxx 未訂閱
試試我測試的CODE,應該可以達到你的要求
 
    int     a[10][10];
    int     *ta = &a[0][0];
    short   b[10][10];
    short   *tb = &b[0][0];        for( int i=0 , j=0; i<(sizeof(a)/sizeof(int)) ; i   , j   )
    {
        tb[j] = (short)ta[i];
    }
系統時間:2024-03-29 5:40:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!