全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1869
推到 Plurk!
推到 Facebook!

請教 algorithm to C / C++ programming

尚未結案
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-20 21:15:48 IP:140.127.xxx.xxx 未訂閱
hi~各位版上的大人:                    您好,因為剛開始學寫程式不久,問題初淺請多包含o    我想作一矩陣乘法,其algo如下:
 
Matrix-Multiply( A , B )
If colums[A]=! rows[A] then error"omcompatible dim."
else for i=1 to rows[A] 
  do for j=1 to colimns[B]
  do{ 
       C[ i,j] = 0 ;
      for k=1 to columns[A]
      do C[ i,j] = C[ i,j]   A[i,k]B[k,j]  // D.P.
     }
  return C
//--------------------------------------------
// 我的程式如下:
int* matrix_multip( int *A , int rA , int cA ,
                   int *B , int rB , int cB )
{
  if( cA == rB )
  {
     int *AxB = new int[rA * cB];
    // ZeroMemory(AxB,sizeof(int)*rA * cB);        for( int i=0 ; i < rA ; i   )
    for( int j=0 ; j < cB ; j   )
    {
         AxB[j i*cB]=0;
        for ( int k=1 ; k < cA ; k   )
        {
          AxB[j i*cB]= AxB[j i*cB]  A[k j*cA]*B[i k*cA] ;
        }
     } return AxB ;
}
}
我的程式在compiler過,但是run有錯,在input為32x32的bmp to array其得到 結果不是我想要的,但不會像128x128的bmp to array會出現在程式這行: AxB[j i*cB]= AxB[j i*cB] A[k j*cA]*B[i k*cA] ; 有誤停滯,其錯誤訊息為:Project xxx.exe raised exception class EAccess Violation with message 'Access violation at address 00402919 in module'dip.exe.' Read of address 02ED4008.' Process stopped. Use Step or Run to continue. 我有一些程式規劃的問題, 一.是在圖檔,我們習慣的是 W X H (是嗎?請教各位大大)和 matrix是row (h) x coloun (w)是不是不同? 如果是想要把圖檔當程一matrix的點,請問要怎樣有一致性,比較清楚,不好意思,之前的問題就是我常不清楚o 二.在http://delphi.ktop.com.tw/topic.php?TOPIC_ID=56102 感謝richtop 給的建意:"因為您現在要處理的是二維陣列或者是影像..."o 好像不同的compiler整合環境不同,其核心和ANSI C/C 是相同的,所以我的老師要求把屬BCB的input與output和處理signal的function分開o 但我不知是不是有 關連,有關我BCB處理inuput,如下,請幫我看這和上述我的coding of function 有沒有什restriction ?
 
int* bmp2array(Graphics::TBitmap *bmp,int *wp,int *hp)
{ .......
for(j=0;jScanLine[j];
   for(i=0;i
Best Regard
kmp    發表人 - kmp 於 2004/09/20  21:40:23    發表人 - kmp 於 2004/09/20  23:20:03
        
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-20 23:36:05 IP:140.129.xxx.xxx 未訂閱
kmp 您好:    底下我修改了您的程式碼,也用了我自己的命名習慣,可以回答您的部分問題。
//---------------------------------------------------------------------------
int* matrix_multip(int *A , int rA , int cA ,
                   int *B , int rB , int cB )
{ if ( cA == rB )
    { int *AxB = new int[rA * cB];
      // ZeroMemory(AxB,sizeof(int)*rA * cB);          for ( int r=0 ; r < rA ; r   )
         for ( int c=0 ; c < cB ; c   )
            { int index = c   r*cB;
              AxB[index]=0;
              for ( int k=0 ; k < cA ; k   )
                 {
                   AxB[index]  = A[r*cA k]*B[k*cB c] ;
                 }
          }
      return AxB ;
    }
}
void show(int *mat, int row, int col)
{ AnsiString result = "";
  for (int r=0; r
我有一些程式規劃的問題, 一.是在圖檔,我們習慣的是 W X H (是嗎?請教各位大大)和 matrix是row (h) x coloun (w)是不是不同? 如果是想要把圖檔當程一matrix的點,請問要怎樣有一致性,比較清楚,不好意思,之前的問題就是我常不清楚o 矩陣與影像都是二維陣列,所以以(row, col)或(x,y)來看都是可以的。例如,影像要用ScanLine時,以逐列處理較方便;矩陣的元素以(row, col)存取,與數學上的使用描述相同,均有助於對該元素的掌握。至於(row, col)與(x,y)兩者,只要您知道它們所描述的是水平或垂直方向,那麼想怎麼用似乎是個人習慣問題了。 至於您的另一個問題,我不是很了解它的真正意義,而且int* bmp2array(Graphics::TBitmap *bmp,int *wp,int *hp)看起來怪怪的,所以暫時無法表示意見。
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-22 00:38:48 IP:140.127.xxx.xxx 未訂閱
hi~ richtop :               您好, 很高興也很感謝您的回應,詳解>< face="Verdana, Arial, Helvetica">引言: kmp 您好: 底下我修改了您的程式碼,也用了我自己的命名習慣,可以回答您的部分問題。 我有在BCB跑過您的程式,同時驗證矩陣相乘的function is ok! < face="Verdana, Arial, Helvetica"> 不過,因為我那程式還是有問題,我的> <>// > < class="code"> void __fastcall TForm1::BOpenClick(TObject *Sender) { //此function是老師的 bmp_read(pBitmap,OpenDialog1); bmp_disp(pBitmap,Image1); f=bmp2array(pBitmap,&w,&h); } int* bmp2array(Graphics::TBitmap *bmp,int *wp,int *hp) { //此function是老師的 int i,j; int *f0,*f; int w,h; Byte *ptr; w=bmp->Width; h=bmp->Height; *wp=w; *hp=h; f0=new int[w*h]; f=f0; for(j=0;jScanLine[j]; for(i=0;iWidth; h=pBitmap->Height; g=new int[w*h]; LLlu(f,w,h,g); array2bmp(g,w/2,h/2,pBitmap); bmp_disp(pBitmap,Image2); } void LLlu(int *f,int w,int h,int *g) { //f:input , g :output g=new int[w*h]; g=LL_Lt_f_L(f,w,h); } int* LL_Lt_f_L( int *f, int w, int h) { int *WL = new int[w*(h/2)]; WL= WL_generate( WL, h , w ); int *WLt=new int[w*(h/2)]; WLt = WLt_generate( WLt, h , w ); //i,j,WLt[j i*h] ok int *WLt_f = new int[w*h]; WLt_f = matrix_multip ( WLt , h , w , f , h , w ); int *WLt_f_WL =new int[w*h]; WLt_f_WL = matrix_multip ( WLt_f , h/2, w, WL ,h , w/2 ); return WLt_f_WL ; } //其matrix_multip()跟您的一樣,其WL_generate和之前那篇同: //http://delphi.ktop.com.tw/topic.php?TOPIC_ID=56102 而我的// WLt is " WL transpose"------------------------ int* WLt_generate( int *WLt , int h,int w ) { for(int i=0;i 以上的code由於我寫程式經驗不足或是很笨,我自己不知問題出在那, show出來的是錯的,我好像忘記印相乘的值, 如有必要,我在補此>
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-22 01:39:16 IP:140.127.xxx.xxx 未訂閱
hi~richtop                         您好 以下是我用來印證我 > < class="code"> int* LL_Lt_f_L( int *f, int w, int h) { FILE *fptr=fopen("d:\\9-21_WLt_f.txt","w"); int *WL = new int[w*h/2]; WL= WL_generate( WL, h , w ); int *WLt=new int[w*h/2]; WLt = WLt_generate( WLt, h , w ); //i,j,WLt[j i*h] ok int *WLt_f = new int[w*h]; WLt_f = matrix_multip ( WLt , h/2 , w , f , w , h ); for ( int j=0 ; j //-------------------------------------- 我的9-21_WLt_f.txt內容如下: 以 32x32 bmp檔輸入如下 我的問題是,這些數據依理論要/4才是和原圖同亮度,但均=!0, 為何出來全黑,也就是其值全為0size變為原1/4,長寬為原一半, //1/4 of H. W. T. 輸入的不管w 或 h ,目前都是相同, w=h 且均為偶數,所以不用考慮 先乘或除,或先除或乘,也就是32 x 32 , 64 x 64, 128 x 128 , 256 x 256我的問題之二,為什上述size,只有128 x 128 會跳出我compiler過,run 停在舉陣乘法(第一篇)的error message,這也就是為什, 我會doubt矩陣乘法有誤o WLt_f( 0, 0 )=263 WLt_f( 1, 0 )=276 WLt_f( 2, 0 )=200 WLt_f( 3, 0 )=117 WLt_f( 4, 0 )=131 WLt_f( 5, 0 )=131 WLt_f( 6, 0 )=144 WLt_f( 7, 0 )=137 WLt_f( 8, 0 )=129 WLt_f( 9, 0 )= 97 WLt_f( 10, 0 )= 82 WLt_f( 11, 0 )= 50 WLt_f( 12, 0 )=143 WLt_f( 13, 0 )=155 WLt_f( 14, 0 )=108 WLt_f( 15, 0 )=117 WLt_f( 0, 1 )=263 WLt_f( 1, 1 )=247 WLt_f( 2, 1 )=145 ......................... WLt_f( 12, 4 )=148 WLt_f( 13, 4 )= 96 WLt_f( 14, 4 )= 96 WLt_f( 15, 4 )= 69 WLt_f( 0, 5 )=146 WLt_f( 1, 5 )=138 WLt_f( 2, 5 )=134 .................. 各位前輩:之前的問章因為我的不清楚,以致誤導幫我看>
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-22 10:15:45 IP:211.76.xxx.xxx 未訂閱
kmp 您好: 我突然有一個問題想先確認一下,再來解決您的提問。 您現在要做的是不是影像的filtering? 如果是的話,那所謂的"矩陣相乘",應該是對應點的相乘之後再相加,而不是真正的矩陣乘法運算。 這點我想先確認一下。 RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-22 19:27:38 IP:140.127.xxx.xxx 未訂閱
hi~RichTop:             前輩您好 謝謝您的回應>< face="Verdana, Arial, Helvetica">引言: kmp 您好: 我突然有一個問題想先確認一下,再來解決您的提問。 您現在要做的是不是影像的filtering? 我之前作過的filter是3x3的Mask有"Average , Median , Laplacian, Sharpen Laplacian , Sobel_X, Sobel_Y "但這些都沒有要對Mask的九個點, 做運算,只是Mask的值不同o 如果是的話,那所謂的"矩陣相乘",應該是對應點的相乘之後再相加,而不是真 我的想法:把對應的點的值做矩陣乘法,請教您說的有何不同? 正的矩陣乘法運算。 我同學一天就把這一階小波轉換,Harr Wavelet Transform程式寫好, 我有搜尋過ktop的有關這資料o我作這不是filter,也不是要對小波研討o 我的重點是在練習寫程式,希望寫程式能進步o 我只知道: 設原圖為一維input array,f, LL是一維output array , LL , LL = WLt * f * WL , WLt是WL的transpose, 而WL的定義在http://delphi.ktop.com.tw/topic.php?TOPIC_ID=56102 如: WL: 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 Best Regard kmp 發表人 - kmp 於 2004/09/22 19:36:22
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-22 23:05:55 IP:211.76.xxx.xxx 未訂閱
kmp 您好:    一下要完全解決您的問題,似乎不太容易,所以我先把看到的問題標示出來,您先核對看看。 < class="code"> int* LL_Lt_f_L( int *f, int w, int h) { FILE *fptr=fopen("d:\\9-21_WLt_f.txt","w"); int *WL = new int[w*h/2]; WL= WL_generate( WL, h , w ); int *WLt=new int[w*h/2]; WLt = WLt_generate( WLt, h , w ); //i,j,WLt[j i*h] ok int *WLt_f = new int[w*h]; WLt_f = matrix_multip ( WLt , h/2 , w , f , w , h ); // WLt_f的大小是(h, w),但矩陣相乘傳回的結果是(h/2, w),這點需要核對。 for ( int j=0 ; j RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-23 13:11:03 IP:140.127.xxx.xxx 未訂閱
hi~ richtop :               您好 很高興謝謝您的指教. <>< face="Verdana, Arial, Helvetica">引言:
int* LL_Lt_f_L( int *f, int w, int h)
{
  ...(省)
   int *WLt_f = new int[w*h/2];
   WLt_f = matrix_multip ( WLt , h/2 , w ,
                             f , w , h );        int  *WLt_f_WL =new int[w*h/4];
   WLt_f_WL = matrix_multip ( WLt_f , h/2, w,
                                 WL ,h , w/2 );
   return  WLt_f_WL ;
}
 
以上的結果會在32x32,64x64,128x128,256x256中只有128x128會跳出error message為"陣列存取超出範圍" ,但我後來改老師的function在f0,和f那,則size >128x128都會出現error message差不多,其code如下.//blue word is original. ,請問為什麼?
 int* bmp2array(Graphics::TBitmap *bmp,int *wp,int *hp)
{
int i,j;
int *f;  //9-23 04// int *f0,*f;
int w,h;
Byte *ptr;    w=bmp->Width;
h=bmp->Height;
*wp=w;
*hp=h;
f=new int[w*h];//f0=new int[w*h];   f=f0;    for(j=0;jScanLine[j];
   for(i=0;i
Best Regard kmp 發表人 - kmp 於 2004/09/23 13:16:14
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-09-23 13:43:35 IP:221.169.xxx.xxx 未訂閱
引言: hi~ richtop : 您好 很高興謝謝您的指教. <>< face="Verdana, Arial, Helvetica">引言:
int* LL_Lt_f_L( int *f, int w, int h)
{
  ...(省)
   int *WLt_f = new int[w*h/2];
   WLt_f = matrix_multip ( WLt , h/2 , w ,
                             f , w , h );        int  *WLt_f_WL =new int[w*h/4];
   WLt_f_WL = matrix_multip ( WLt_f , h/2, w,
                                 WL ,h , w/2 );
   return  WLt_f_WL ;
}
 
以上的結果會在32x32,64x64,128x128,256x256中只有128x128會跳出error message為"陣列存取超出範圍" ,但我後來改老師的function在f0,和f那,則size >128x128都會出現error message差不多,其code如下.//blue word is original. ,請問為什麼?
 int* bmp2array(Graphics::TBitmap *bmp,int *wp,int *hp)
{
int i,j;
int *f;  //9-23 04// int *f0,*f;
int w,h;
Byte *ptr;    w=bmp->Width;
h=bmp->Height;
*wp=w;
*hp=h;
f=new int[w*h];//f0=new int[w*h];   f=f0;    for(j=0;jScanLine[j];
   for(i=0;i
Best Regard kmp 發表人 - kmp 於 2004/09/23 13:16:14 Kmp:你可否先檢查一下 w=bmp->Width; h=bmp->Height; 這wh的值? Andy Chang
------
Andy Chang
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-09-24 09:16:33 IP:140.127.xxx.xxx 未訂閱
hi~richtop大人                您好,很高興感謝您的教導及看我的>因為問題本來只是"矩陣乘法",丟出整個> 希望有機會請多指教,及包含 >
系統時間:2024-04-27 11:48:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!