請教 algorithm to C / C++ programming |
尚未結案
|
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
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;jBest Regard kmp 發表人 - kmp 於 2004/09/20 21:40:23 發表人 - kmp 於 2004/09/20 23:20:03 |
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
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 發送簡訊給我 |
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;j
|
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
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
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
|
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
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 發送簡訊給我 |
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
|
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
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;jBest Regard kmp 發表人 - kmp 於 2004/09/23 13:16:14 |
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
引言: hi~ richtop : 您好 很高興謝謝您的指教. <>< face="Verdana, Arial, Helvetica">引言:以上的結果不會在32x32,64x64,128x128,256x256中只有128x128會跳出error message為"陣列存取超出範圍" ,但我後來改老師的function在f0,和f那,則size >128x128都會出現error message差不多,其code如下.//blue word is original. ,請問為什麼?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 ; } 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;jBest Regard kmp 發表人 - kmp 於 2004/09/23 13:16:14 Kmp:你可否先檢查一下 w=bmp->Width; h=bmp->Height; 這w及h的值? Andy Chang
------
Andy Chang |
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |