2016-12-02 163 views
0

我有這個問題,我有一個N×M的矩陣,我想通過一個3×3矩陣只是作爲一個卷積矩陣乘法 example in this link矩陣乘法問題

這是矩陣的代碼相乘:

int width = img.getWidth(); 
int height = img.getHeight(); 

int matrix[][] = new int[width][height]; 
int edgeMatrix[][] = { 
     {-1,-1,-1}, 
     {-1,8,-1}, 
     {-1,-1,-1} 
}; 

這是週期的代碼:

for (int x = 0; x < width; x++) { 
    w = 0; 
    holderX = x; 
    for (w = 0; w < 3; w++) { 
     v = 0; 
     if (w > 0) 
      x++; 
      for (v = 0; v < 3; v++) { 
       sum = sum + matrix[v][x] * edgeMatrix[v][w]; 
       if (w == 2 && v == 2) 
        x = holderX; 
      } 
     } 
    } 

該循環已經相乘的矩陣的3中的第一「行」。

T嘗試以不同的方式來實現這一點,但我只是不能得到,當矩陣自動到達寬度的結尾N值增加一個,然後重新開始,並在同一時間仍然工作的價值內部矩陣乘法。

感謝您的幫助。

回答

0

你不需要holderX,但需要一個循環。

int width = img.getWidth(); 
int height = img.getHeight(); 

int input[][] = img.getPixels(); // or whatever api you use 
int output[][] = new int[height][width]; 
int kernel[][] = { 
    {-1,-1,-1}, 
    {-1,8,-1}, 
    {-1,-1,-1} 
}; 


for (int y = 0; y < height; y++) { 
    for (int x = 0; x < width; x++) { 
    int accumulator = 0; 
    for (int v = 0; v < 3; v++) { 
     for (int w = 0; w < 3; w++) { 
     int sy = y + v - 1; 
     int sx = x + w - 1; 
     if (sy >= 0 && sy < height && sx >= 0 && sx < width)) { 
      accumulator += input[sy][sx] * kernel[v][w]; 
     } 
     } 
    } 
    output[sy][sx] = accumulator; 
    } 
}