Java / Обработка, как сделать умножение матриц с помощью точечного продукта - PullRequest
0 голосов
/ 12 мая 2018

Здравствуйте, я использую обработку (которая, по сути, просто Java), и я хотел иметь действительно класс матрицы simpel, чтобы помочь мне с моей нейронной сетью.

Он работает хорошо, но "матричное умножение"частично проделана настоящая работа.

Я знаю, что мой код неверен, но я не могу найти исправления.

Начало класса выглядит следующим образом:

class Matrix {

   int rows;
   int cols;
   double[][] matrix;

   Matrix(int rows_ , int cols_ ) {
       rows = rows_;
       cols = cols_;

       // set size of matrix
       matrix = new double[rows][cols];

      // fill with 0s
      for (int i = 0; i < rows; i++) {
         for (int j = 0; j < cols; j++) {
            matrix[i][j] = 0;
         }
      }
   }

Неправильная часть находится здесь:

Matrix Matrix_Multipication(Matrix b) {

    // Create new Matrix for the result
    Matrix c = new Matrix(b.cols,rows);

    // check if not number of cols is number of rows of b
    if (cols != b.rows) {
      return c;
    }
    // Compute
    for(int i=0; i< c.cols; i++){
      for(int j=0; j< c.rows; j++){
        for(int k=0; k< rows; k++){
          c.matrix[i][j] = c.matrix[i][j] + matrix[i][k] * b.matrix[k][j]; // here is the error
          }
        }
      }
     // return new matrix
     return c;
 }

Ошибка:

ArrayIndexOutOfBoundsExcpetion: 1

Я получаю эту ошибку, только еслиРазмер столбца один:

Matrix m1 = new Matrix(2,3);
Matrix m2 = new Matrix(3,1); // here the 1
Matrix m3 = m1.Matrix_Multipication(m2); // apply Matrix_Multipication

Я думаю, что, возможно, конструктор тоже работает, но я не знаю, как это будет работать.

Также вы можете показать мою библиотеку для матриц и как я могу установить их, если вы не можете найти ни одной ошибки.

ps: я проводил повторные исследования, но я действительно не нашел ничего,Я решил написать свою собственную версию библиотеки Neural Network "The-Coding-Train" https://www.youtube.com/watch?v=NgZAIkDcPkI&list=PLRqwX-V7Uu6Y7MdSCaIfsxc561QI0U0Tb&index=8.

Пожалуйста, скажите мне, что мне нужно улучшить в этом вопросе и в этом коде.

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Вы поменялись рядами и столбцами.

Первый параметр в конструкторе - это строки, а второй - столбцы:

Matrix c = new Matrix(rows,b.cols);

А поскольку матрица является матрицей основного порядка строк, управляющая переменная i должна работать от = 0 до < c.rows, а управляющая переменная j от = 0 до < c.cols:

for(int i=0; i< c.rows; i++){
    for(int j=0; j< c.cols; j++){
        for(int k=0; k< rows; k++){
            c.matrix[i][j] = c.matrix[i][j] + matrix[i][k] * b.matrix[k][j]; 
        }
    }
}
0 голосов
/ 12 мая 2018

Первый индекс означает строку. Но вы повторяете до c.cols. Второй индекс - столбец. Но вы повторяете до c.rows. Просто поменяйте их местами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...