Что не так с моим методом умножения матриц? - PullRequest
1 голос
/ 15 февраля 2012

Я пишу метод умножения матриц с использованием Java. Мой класс Table, который является 2D-массивом. Это конструктор Table:

public Table(int n, int m, int val)
    {
        assert(n > 0 && m > 0);
        elements = new int[n][m];

        for(int row = 0; row < elements.length; row++)
        {
            for(int col = 0; col < elements[row].length; col++)
            {
                elements[row][col] = val;
            }
        }
    }

И вот метод, о котором я говорю:

public static Table product(Table a, Table b)
    {
        assert(a.numCols() == b.numRows()) : "different dimensions!" + null;
        Table c = new Table(a.numRows(), b.numCols(),0);
        int res = 0;

        for(int row = 0; row < a.numRows(); row++)
        {
            for(int col = 0; col < b.numCols(); col++)
            {
                for(int k = 0; k < a.numCols(); k ++)
                {
                    res = res + a.get(row, k) * b.get(k, col);
                    c.set(row, col, res);
                }
            }

        }
        System.out.println(c.toString());
        return c;

    }

Метод должен возвращать новый Table, который является результатом умножения a и b. Я думаю, что довольно ясно, что он должен делать. Проблема в том, что он правильно вычисляет только c[0][0]; Таким образом, c.get(0,0) вычисляется правильно, а результаты после этого - нет. Вы видите, что я делаю не так? Я ценю вашу помощь.

Ответы [ 4 ]

2 голосов
/ 15 февраля 2012

Первое, что выглядит странно:

int res = 0;

должно быть сброшено и в другом месте. Надеюсь, это поможет:)

...
        for(int col = 0; col < b.numCols(); col++)
        {
            res = 0;
            for(int k = 0; k < a.numCols(); k ++)
....
1 голос
/ 15 февраля 2012

int res = 0; должно быть между вторым и третьим циклами for.

1 голос
/ 15 февраля 2012

Сбросить res в первом цикле (может потребоваться некоторое переупорядочение циклов, еще не проверенных и матриц давно) или просто изменить

res = res + a.get(row, k) * b.get(k, col);

на

res = c.get(row, col) + a.get(row, k) * b.get(k, col);
1 голос
/ 15 февраля 2012

res устанавливается на ноль только за пределами всего набора циклов. Его значение не имеет большого смысла в вашей основной программе умножения. Перепроверьте логику петли.

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