Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с реализацией матриц 
V
    Опции темы
kosmonaFFFt
Дата 18.9.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Доброго всем времени суток.

Понадобился мну сегодня класс МАТРИЦА, в котором было бы реализовано умножение этих самых матриц.
И решил я сделать так:
Код

package project2;

import java.util.ArrayList;

public class FMatrix extends ArrayList<ArrayList<Integer>> {
    
    //Конструктор. Принимает размер и начальное значение элементов матрицы.
    public FMatrix(Integer linesCount, Integer columnsCount, Integer initialValue) {
        super();
        for (Integer lineNumber = 0; lineNumber < linesCount; ++lineNumber) {
            this.add(new ArrayList<Integer>());
            for (Integer columnNumber = 0; columnNumber < columnsCount; ++columnNumber) {
                this.get(lineNumber).add(initialValue);
            }
        }
    }
    
    //Умножение матриц.
    public static FMatrix MultiplyMatrix(FMatrix left, FMatrix right) throws MultiplyMatrixException {
        if (left.get(0).size() != right.size()) {
            throw new MultiplyMatrixException("Ошибка умножения матриц!!! Несоответсвие размера!!!");
        }
        FMatrix result = new FMatrix(left.size(), right.get(0).size(), 0);
        for (Integer lineNumber = 0; lineNumber < left.size(); ++lineNumber) {
            for (Integer columnNumber = 0; columnNumber < right.get(0).size(); ++columnNumber) {
                for (Integer index = 0; index < right.size(); ++index) {
                    //И вот тут то и закрался подвох.
                    //======================================================================================
                    result.get(lineNumber).get(columnNumber) += left.get(lineNumber).get(index) * right.get(index).get(columnNumber);
                    //======================================================================================
                }
            }
        }
        return result;
    }
}


И при реализации умножения столкнулся с проблемой - метод ArrayList<Integer>.get(index) возвращает значение, а не ссылку и элемент матрицы нельзя изменить. (здесь я могу ошибаться)
Сообщение об ошибке:
Код

required: variable
found   : value

Прошу помощи -> (как это можно обойти) || (сделать по другому без лишних телодвижений).

Заранее спасибо.

Это сообщение отредактировал(а) kosmonaFFFt - 18.9.2008, 19:00


--------------------
user posted image
PM MAIL ICQ   Вверх
duk
Дата 18.9.2008, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: 4
Всего: 4



Там еще set есть.
PM MAIL   Вверх
polosatij
Дата 18.9.2008, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8




ты очень сложно решение задачи написал.. я бы на твоём месте, сначало всё упростил..


Цитата(kosmonaFFFt @  18.9.2008,  18:58 Найти цитируемый пост)
метод ArrayList<Integer>.get(index) возвращает значение,


ArrayList<Integer>.indexOf('Object') даст index
ArrayList<Integer>.set(index, 'new Object') посадит Объект на нужное место..

надеюсь понятно объяснил и в тему, т.к. не стал смотреть твоё задание целиком, ты перемудрил сильно..



--------------------
PM   Вверх
kosmonaFFFt
Дата 19.9.2008, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Цитата(duk @  18.9.2008,  22:25 Найти цитируемый пост)
Там еще set есть.

По моему это не массив/список (что мне и надо) а множество и 
"sets contain no pair of elements e1 and e2 such that e1.equals(e2)" мне не подходит.


Цитата(polosatij @  18.9.2008,  22:43 Найти цитируемый пост)
ты очень сложно решение задачи написал.. я бы на твоём месте, сначало всё упростил..

Куда уж проще. Надо сделать класс "матрица" и реализовать умножение.

Цитата(polosatij @  18.9.2008,  22:43 Найти цитируемый пост)
ArrayList<Integer>.indexOf('Object') даст index

Индекс то мне зачем, известен уже.

А насчет ArrayList<Integer>.set(...) спасибо - попробую.



--------------------
user posted image
PM MAIL ICQ   Вверх
duk
Дата 19.9.2008, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: 4
Всего: 4



Цитата(kosmonaFFFt @  19.9.2008,  09:53 Найти цитируемый пост)
Цитата(duk @  18.9.2008,  22:25 Найти цитируемый пост)
Там еще set есть.

По моему это не массив/список (что мне и надо) а множество и 
"sets contain no pair of elements e1 and e2 such that e1.equals(e2)" мне не подходит.


Я имел ввиду метод ArrayList<T>.set(int, T). Ты же писал, что не можешь изменить массив. Так вот тебе нужно исползовать set(int, T), так как начиная с java 5.0 при использовании интерфейсных типов (int, double ...) происходит автоупаковка/автораспаковка: int -> Integer(), Integer -> int. Так вот ты как раз и получаешь значение, а не ссылку (как бы работаешь с примитивом).
PM MAIL   Вверх
Platon
Дата 19.9.2008, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Уважаемый, а к чему такая сложная схема??? Java предоставляет богатый ассортимент инструментов не для того чтобы усложнять себе жизнь.
Почему бы вам не сделать такое:

Примеры с википедии, ответы совпадают

Код

import java.util.Arrays;

/**
 * Пользователь: Platon
 * Дата: 18.09.2008
 * Время: 22:23:37
 */
public class IntegerMatrix {

    private int[][] matrix;

    public IntegerMatrix(int rows, int cols) {
        this(new int[rows][cols]);
    }

    public IntegerMatrix(int[][] matrix) {
        this.matrix = matrix;
    }

    public int[][] getData() {
        return matrix;
    }

    public IntegerMatrix multiply(IntegerMatrix matrix) {
        int[][] m2 = matrix.matrix;
        int[][] m1 = this.matrix;
        if (m2.length != m1[0].length || m1.length != m2[0].length) throw new IllegalArgumentException("number of columns of the left matrix is not the same as the number of rows of the right matrix");
        int[][] res = new int[m1.length][m2[0].length];
        for (int i = 0; i < m1.length; i++)
            for (int j = 0; j < m2[0].length; j++) {
                int val = 0;
                for (int k = 0; k < m1[0].length; k++)
                    val += m1[i][k]*m2[k][j];
                res[i][j] = val;
            }
        return new IntegerMatrix(res);
    }

    public static void main(String[] args) {
        System.out.println(Arrays.deepToString(new IntegerMatrix(new int[][] {{2,3}, {5,7}}).multiply(new IntegerMatrix(new int[][] {{-1, 2}, {-2, 3}})).getData()));
        System.out.println(Arrays.deepToString(new IntegerMatrix(new int[][] {{-1, 2}, {-2, 3}}).multiply(new IntegerMatrix(new int[][] {{2,3}, {5,7}})).getData()));
    }
}

PM MAIL ICQ   Вверх
Shaggie
Дата 19.9.2008, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: 4
Всего: 72



Ещё можно заглянуть во внутренности библиотеки commons-math, там есть классы для работы с матрицами. Возможно, опенсурсное решение придётся вам по вкусу  smile 


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
kosmonaFFFt
Дата 20.9.2008, 04:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Цитата(duk @  19.9.2008,  19:26 Найти цитируемый пост)
Я имел ввиду метод ArrayList<T>.set(int, T). Ты же писал, что не можешь изменить массив. Так вот тебе нужно исползовать set(int, T), так как начиная с java 5.0 при использовании интерфейсных типов (int, double ...) происходит автоупаковка/автораспаковка: int -> Integer(), Integer -> int. Так вот ты как раз и получаешь значение, а не ссылку (как бы работаешь с примитивом).

Недопонял малость. smile

Сделал все с set, работает. Всем спасибо за помощь.



--------------------
user posted image
PM MAIL ICQ   Вверх
polosatij
Дата 20.9.2008, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



если честно, я не понимаю, как люди могут писать такое

Код

                for (int k = 0; k < m1[0].length; k++)
                    val += m1[i][k]*m2[k][j];
                res[i][j] = val;[/quote]



 smile 

без скобок {}.. это чтоб себе и другим жизнь упростить типа?  smile 



--------------------
PM   Вверх
Platon
Дата 20.9.2008, 10:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Цитата(polosatij @  20.9.2008,  11:31 Найти цитируемый пост)
если честно, я не понимаю, как люди могут писать такое


А какие проблемы? Читается нормально...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0641 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.