Search code examples
javamatrixmultiplicationconvolution

Matrix multiplication issue


I have this problem, i have a NxM matrix and i want to multiply it by a 3x3 matrix just as a convolutional matrix multiplication example in this link

This are the code of the matrix:

 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}
 };

This is the code of the cycle:

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;
            }
        }
    }

This cycle already multiply the first "row" of 3 of the matrix.

T tried in a different ways to achieve this but i just cant get that when the matrix reach the end of the width automatically the N value increase one and then starts over again and in the same time the value still working on the internal matrix multiplication.

Thanks for the help.


Solution

  • You dont need holderX, but need one more loop.

    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;
      }
    }