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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс матриц 
:(
    Опции темы
Joil
  Дата 30.1.2009, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вот начал Java изучать, решил для себя написать класс матриц (потренироваться с классами, да и вообще пригодится), он правда еще не доделан...
Вот он:
Код

class Matrix {
    double matrix[][];
    private int n;
    private int m;
    // Конструктор матрицы n*m
    Matrix(int Strings, int Columns) {
        n = Strings;
        m = Columns;
        matrix = new double[n][m];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                    matrix[i][j] = 0;
    }
    // Конструктор единичной матрицы
    Matrix(int Dimension) {
        n = Dimension;
        m = Dimension;
        matrix = new double[n][m];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                if (i == j)
                    matrix[i][j] = 1;
                else
                    matrix[i][j] = 0;
    }
    // Конструктор матрицы с одинаковыми элементами
    Matrix(int Strings, int Columns, double Element) {
        n = Strings;
        m = Columns;
        matrix = new double[n][m];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                matrix[i][j] = Element;
    }
    // Умножение матрицы на число
    Matrix MultiNum(double Number) {
        Matrix temp = new Matrix(n, m);
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                temp.matrix[i][j] = Number * this.matrix[i][j];
        return temp;
    };
    // Сложение матриц одинаковой размерности
    Matrix Sum(Matrix InMatrix) {
        Matrix temp = new Matrix(n, m);
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                temp.matrix[i][j] = InMatrix.matrix[i][j] + this.matrix[i][j];
        return temp;
    };
    // Получение противоположной матрицы
    Matrix Opp() {
        Matrix temp = new Matrix(n, m);
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                temp.matrix[i][j] = - this.matrix[i][j];
        return temp;
    };
    // Произведение матриц
    Matrix Multi(Matrix InMatrix) {
        Matrix temp = new Matrix(n, m);
        for (int k = 0; k < InMatrix.m; k++)
            for (int i = 0; i < n; i++)
                for (int j = 0; j < m; j++)
                    temp.matrix[i][k] += this.matrix[i][j] * InMatrix.matrix[j][k];
        return temp;
    };
    // Элементарные преобразования: Перестановка местами 2-х паралельных рядов матриц
    Matrix MovG(int one, int two) {
        Matrix temp = new Matrix(n, m);
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                if ((i != one) && (i != two))
                    temp.matrix[i][j] = this.matrix[i][j];
                else {
                    temp.matrix[one][j] = this.matrix[two][j];
                    temp.matrix[two][j] = this.matrix[one][j];
                }
        return temp;
    };
    
    Matrix MovV(int one, int two) {
        Matrix temp = new Matrix(n, m);
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                if ((j != one) && (j != two))
                    temp.matrix[i][j] = this.matrix[i][j];
                else {
                    temp.matrix[i][one] = this.matrix[i][two];
                    temp.matrix[i][two] = this.matrix[i][one];
                }
        return temp;
    };
    // Элементарные преобразования: Умножение элементов ряда матрицы на число
    Matrix MultiNumG(int one, double num) {
        Matrix temp = new Matrix(n, m);
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                if (i != one)
                    temp.matrix[i][j] = this.matrix[i][j];
                else
                    temp.matrix[i][j] = num * this.matrix[i][j];
        return temp;
    }
    
    Matrix MultiNumV(int one, double num) {
        Matrix temp = new Matrix(n, m);
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                if (j != one)
                    temp.matrix[i][j] = this.matrix[i][j];
                else
                    temp.matrix[i][j] = num * this.matrix[i][j];
        return temp;
    }
    // Элементарные преобразования: прибавление к эелементам ряда матрицы элементов другово ряда,
    // умноженного на число
    Matrix PlusMultiNumG(int one, int two, double num) {
        Matrix temp = new Matrix(n, m);
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                if (i != one)
                    temp.matrix[i][j] = this.matrix[i][j];
                else
                    temp.matrix[one][j] = this.matrix[one][j] + num * this.matrix[two][j];
        return temp;
    }
    
    Matrix PlusMultiNumV(int one, int two, double num) {
        Matrix temp = new Matrix(n, m);
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                if (j != one)
                    temp.matrix[i][j] = this.matrix[i][j];
                else
                    temp.matrix[i][one] = this.matrix[i][one] + num * this.matrix[i][two];
        return temp;
    }
    // Вывод матрицы в консоль
    // А тут еще нада добавить перегруженный метод для вывода в файл
    // ... да еще и считывание с файла нада сделать
    void OutMatrix() {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++)
                System.out.print(this.matrix[i][j] + " ");
            System.out.println();
        }
    }
    // Вычисление определителя методом Гаусса, работает он правда не для всех матриц, т. е. если
    // элемент a[0][0] будет равен нулю или ведущий элемент на одной из следующих итераций
    // будет равен или близок к нулю то метод не сойдется... короче нада другие методы посмотреть
    double Det() {
        Matrix temp = new Matrix(n, m);
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                temp.matrix[i][j] = this.matrix[i][j];
        double det = temp.matrix[0][0];
        double one, two;
        for (int i = 0; i < n; i++) {
            one = temp.matrix[i][i];
            for (int j = i; j < n; j++)
                temp.matrix[i][j] = temp.matrix[i][j] / one;
                for (int k = i+1; k < n; k++) {
                    two = - temp.matrix[k][i];
                    for (int j = i; j < n; j++)
                        temp.matrix[k][j] = temp.matrix[k][j] + temp.matrix[i][j] * two;
                }
            if (i < n-1)
                det *= temp.matrix[i+1][i+1];
            }
        return det;
    }
    // еще нада сделать нахождение обратной матрицы, вычисление минора, ранга и еще че там есть...
}

Так вот, прошу указать на ошибки, недоделки и т. п. Как лучше и все в таком духе... короче критика smile
--------------------
Who had deceived thee so often as thyself? © Benjamin Franklin--------------------Always bear in mind that your own resolution to succeed is more important than any other. © Abraham Lincoln--------------------If you need it - do it, if you want it - take it! © ...
PM MAIL ICQ   Вверх
Akeem
Дата 30.1.2009, 11:04 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 14.7.2006
Где: Киев/Украина

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



Первое что можно улучшить вместо функции Sum переписать под себя оператор + . Тоже самое можно сделать и для *


--------------------
Мир огромен и мы только муравьи в нём! (С) formicha

PM MAIL WWW ICQ   Вверх
math64
Дата 30.1.2009, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Akeem @  30.1.2009,  11:04 Найти цитируемый пост)
Первое что можно улучшить вместо функции Sum переписать под себя оператор + . Тоже самое можно сделать и для *

А разве в Java можно переопределять операторы?
PM   Вверх
ecologist
Дата 30.1.2009, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если на критику не обижаемся, то выкини пример на хрен smile

Штука в том, что основная работа программиста - это решать совсем другие задачи. Здесь уже поднимали кучу таких тем:
Например - Автоматизировать обработку заказов от клиентов. 

1. Клиент заполняет форму с заказом от клиента - выбирает какие-то товары.
2. Заказ клиента анализируется и тот товар, который есть на складе, резервируется.
3. Из товаров, которых нет формируются заказы поставщикам. Например книги - одному, диски - другому и т.д.
4. Т.к. поставщики вряд ли будут на каждый чих присылать товар, то должен быть механизм какого-то собирания всех заказов этому поставщику. После того как система решит, что уже набралось много, она формирует заказ поставщику, отправляет его поставщику и ждет.
5. Возможно, что поставщик может даже сказать приблизительную дату поставки. Тогда можно сформировать письмо клиенту, когда заказ будет выполнен.
5. От поставщика фиксируется приход. Он распределяется на все заказы от клиентов.
6. Система отслеживает готовность заказов. При готовности посылает сообщение клиенту - все готово.
7. Также в системе может быть предусмотрена проверка устаревания заказов.
- Заказ не получен клиентом, надо его расформировать и отправить товар на склад. Или может быть даже поставщику.
- Заказ не набирается (нет товара) - послать письмо клиенту, что заказ не может быть выполнен полностью.
8. Тут еще куча вопросов по поводу оплаты ипрочая.

И вот это более реальная работа программиста.

А математические задачки - фигня.
PM MAIL   Вверх
Akeem
Дата 30.1.2009, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 14.7.2006
Где: Киев/Украина

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



math64, 
Нельзя, но было бы полезно. =)


Joil, 
Для упражнения в языке советую сразу начинать с написания собственного логирования с разным уровнем доступа (файл, консоль, другой оутпут). 
Также написать нектороые утилитки для преобразования строк в масивы и обратно. 
Разобратся с использованием регулярных выражений. 

И math64 прав, учить язык надо на реальных задачах, а не абстрактных.



--------------------
Мир огромен и мы только муравьи в нём! (С) formicha

PM MAIL WWW ICQ   Вверх
vdim
Дата 30.1.2009, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я бы два из трех конструкторов реализовал немного по другому:
Код

    Matrix(int Strings, int Columns) {
        init(Strings, Columns, 0);
    }

    // Конструктор матрицы с одинаковыми элементами
    Matrix(int Strings, int Columns, double Element)  {
        init(Strings, Columns, Element);
    }

    // Конструктор матрицы с одинаковыми элементами
    private void init(int Strings, int Columns, double Element)  {
        n = Strings;
        m = Columns;
        matrix = new double[n][m];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                matrix[i][j] = Element;
    }



На мой взгляд, это позволит уменьшить количество повторяющегося кода.
PM MAIL   Вверх
math64
Дата 31.1.2009, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ещё можно создать копирующий конструктор.
Кстати, строка матрицы по-английски - row
Вычисление определителя можно сделать с помощью рекурсии, примерно так:
Код

double det() {
int[] вычеркнутые_столбцы = new int[m];
return det(0, вычеркнутые_столбцы);
}
double det(int k, int[] вычеркнутые_столбцы) {
double d = 0; int s = 1;
for (int i = 0; i < m; i++) {
   if (contains(вычеркнутые_столбцы, k, i))
     continue;
   if(k == n-1)
     return matrix[k][i];
   вычеркнутые_столбцы[k] = i;
   d +=  s * matrix[k][i] * det(k+1, вычеркнутые_столбцы);
   s = - s;
}
return d;
}

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

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

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


 




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


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

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