Участник:Aduenko
Материал из MachineLearning.
(→Отчеты о научно-исследовательской работе) |
(→Отчеты о научно-исследовательской работе) |
||
Строка 208: | Строка 208: | ||
*55я Конференция МФТИ, доклад "Динамика волчка с частичной внутренней диссипацией". | *55я Конференция МФТИ, доклад "Динамика волчка с частичной внутренней диссипацией". | ||
*56я Конференция МФТИ, доклад "О резонансных движениях маятника с вибрирующей точкой подвеса". | *56я Конференция МФТИ, доклад "О резонансных движениях маятника с вибрирующей точкой подвеса". | ||
+ | |||
+ | Диск | ||
+ | Использовано 6,62 ГБ (44%) из 15 ГБНастройки | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Заголовок | ||
+ | |||
+ | Владелец | ||
+ | |||
+ | Последнее изменение | ||
+ | Сегодня | ||
+ | 0:08 | ||
+ | Вы | ||
+ | добавили 1 объект | ||
+ | C++ | ||
+ | main.cpp | ||
+ | За прошлую неделю | ||
+ | марта 05 | ||
+ | Вы | ||
+ | открыли доступ к 1 объекту | ||
+ | Postscript | ||
+ | map_tryyy.eps | ||
+ | Может просматривать | ||
+ | Vadim Strijov | ||
+ | A | ||
+ | Может просматривать | ||
+ | Anastasia Motrenko | ||
+ | марта 04 | ||
+ | Вы | ||
+ | добавили 1 объект | ||
+ | Postscript | ||
+ | map_tryyy.eps | ||
+ | марта 04 | ||
+ | Вы | ||
+ | добавили 1 объект | ||
+ | Папка Google Диска | ||
+ | SAR | ||
+ | За прошлый месяц | ||
+ | февр. 26 | ||
+ | Вы | ||
+ | отредактировали 1 объект | ||
+ | Google Таблицы | ||
+ | Новая таблица | ||
+ | февр. 23 | ||
+ | Вы | ||
+ | открыли доступ к 1 объекту | ||
+ | Архив | ||
+ | Articles.zip | ||
+ | Может просматривать | ||
+ | Пользователи, у которых есть ссылка | ||
+ | февр. 23 | ||
+ | Вы | ||
+ | добавили 2 объекта | ||
+ | Архив | ||
+ | Articles.zip | ||
+ | PDF | ||
+ | advanced-economicsciences2013.pdf | ||
+ | В прошлом году | ||
+ | янв. 08 | ||
+ | Вы | ||
+ | открыли доступ к 1 объекту | ||
+ | Архив | ||
+ | Разжевайкин.zip | ||
+ | Может просматривать | ||
+ | Пользователи, у которых есть ссылка | ||
+ | янв. 08 | ||
+ | Вы | ||
+ | добавили 1 объект | ||
+ | Архив | ||
+ | Разжевайкин.zip | ||
+ | 20 дек. 2013 г. | ||
+ | Вы | ||
+ | открыли доступ к 1 объекту | ||
+ | PDF | ||
+ | B1Beg_LB_Kap01-04.pdf | ||
+ | Может просматривать | ||
+ | Пользователи, у которых есть ссылка | ||
+ | 20 дек. 2013 г. | ||
+ | Вы | ||
+ | добавили 3 объекта | ||
+ | PDF | ||
+ | B1Beg_LB_Kap01-04.pdf | ||
+ | PDF | ||
+ | thesis.pdf | ||
+ | Изображение | ||
+ | DSC_0841.JPG | ||
+ | #include <iostream> | ||
+ | #include <vector> | ||
+ | #include <algorithm> | ||
+ | #include <math.h> | ||
+ | |||
+ | template <class T> | ||
+ | class Matrix | ||
+ | { | ||
+ | public: | ||
+ | std::vector <std::vector <T> > data; | ||
+ | Matrix(); | ||
+ | int num_columns(); | ||
+ | int num_rows(); | ||
+ | void multiply_by_costant(T multiplier); | ||
+ | void multiply_by_matrix_left(Matrix left_matrix); | ||
+ | void multiply_by_matrix_right(Matrix right_matrix); | ||
+ | void put_data(const std::vector <std::vector <T> > input_data); | ||
+ | void print(); | ||
+ | void transpose(); | ||
+ | void inverse(); | ||
+ | void fill(int size); | ||
+ | }; | ||
+ | |||
+ | template <class T> | ||
+ | void Matrix<T>::fill(int size) | ||
+ | { | ||
+ | data.clear(); | ||
+ | data.resize(size); | ||
+ | for (int index = 0; index < size; ++index) | ||
+ | { | ||
+ | data.at(index).resize(size); | ||
+ | for (int position = 0; position < size; ++position) | ||
+ | { | ||
+ | data.at(index).at(position) = rand() % 100; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | template <class T> | ||
+ | void Matrix<T>::inverse() | ||
+ | { | ||
+ | int N = data.size(); | ||
+ | int rn[N],cn[N]; | ||
+ | int j, k; | ||
+ | |||
+ | for(j=N;j--;) | ||
+ | { | ||
+ | rn[j]=cn[j]=j; | ||
+ | } | ||
+ | double gaus_minved = 1e99; | ||
+ | long double gaus_deter=1; | ||
+ | int gaus_ostatok; | ||
+ | for(gaus_ostatok=N; gaus_ostatok; gaus_ostatok--) | ||
+ | { | ||
+ | int jved,kved; | ||
+ | double vved=-1; | ||
+ | double t; | ||
+ | |||
+ | // ���������� ���������������� | ||
+ | for(j=N;j--;) | ||
+ | { | ||
+ | // std::cout << j << "\n"; | ||
+ | if(~rn[j]) | ||
+ | { | ||
+ | for(k=N;k--;) | ||
+ | if(~cn[k]) | ||
+ | { | ||
+ | if(vved<fabs(data[j][k])) | ||
+ | { | ||
+ | vved=fabs(data[j][k]); | ||
+ | jved=j; | ||
+ | kved=k; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | if(gaus_minved > vved) | ||
+ | { | ||
+ | gaus_minved=vved; | ||
+ | } | ||
+ | gaus_deter *= data[jved][kved]; | ||
+ | if(vved<1e-99) | ||
+ | { | ||
+ | for(j=N;j--;) | ||
+ | { | ||
+ | if(~rn[j]) | ||
+ | { | ||
+ | for(k=N;k--;) | ||
+ | { | ||
+ | data[j][k] = NAN; | ||
+ | } | ||
+ | } | ||
+ | if(~cn[j]) | ||
+ | { | ||
+ | for(k=N;k--;) | ||
+ | { | ||
+ | data[k][j] = NAN; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | int jt=rn[jved],kt=cn[kved]; | ||
+ | |||
+ | // ������������������������ | ||
+ | for(j=N;j--;) | ||
+ | { | ||
+ | t=data[kt][j]; | ||
+ | data[kt][j]=data[jved][j]; | ||
+ | data[jved][j]=t; | ||
+ | } | ||
+ | for(j=N;j--;) | ||
+ | { | ||
+ | t=data[j][jt]; | ||
+ | data[j][jt]=data[j][kved]; | ||
+ | data[j][kved]=t; | ||
+ | } | ||
+ | |||
+ | rn[jved]=rn[kt]; | ||
+ | cn[kved]=cn[jt]; | ||
+ | rn[kt]=cn[jt]=-1; | ||
+ | |||
+ | vved=data[kt][jt]; | ||
+ | data[kt][jt]=1; | ||
+ | for(j=N;j--;) | ||
+ | { | ||
+ | if(j==kt) | ||
+ | { | ||
+ | continue; | ||
+ | } | ||
+ | double mul=data[j][jt]/vved; | ||
+ | data[j][jt]=0; | ||
+ | for(k=N;k--;) | ||
+ | { | ||
+ | data[j][k]-=data[kt][k]*mul; | ||
+ | } | ||
+ | // ���������� �������������������� �������� ���������� N^3 ���������������� | ||
+ | } | ||
+ | for(k=N;k--;) | ||
+ | { | ||
+ | data[kt][k] /= vved; | ||
+ | } | ||
+ | } | ||
+ | // for (int i = 0; i < N; ++i) | ||
+ | // { | ||
+ | // for (int j = 0; j < N; ++j) | ||
+ | // { | ||
+ | // std::cout << m[i][j] << " "; | ||
+ | // } | ||
+ | // } | ||
+ | } | ||
+ | |||
+ | template <class T> | ||
+ | void Matrix<T>::transpose() | ||
+ | { | ||
+ | std::vector <std::vector <T> > new_data = this->data; | ||
+ | for (int index = 0; index < new_data.at(0).size(); ++index) | ||
+ | { | ||
+ | for (int position = 0; position < new_data.size(); ++position) | ||
+ | { | ||
+ | this->data.at(index).at(position) = new_data.at(position).at(index); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | template <class T> | ||
+ | void Matrix<T>::print() | ||
+ | { | ||
+ | for (int index = 0; index < this->num_rows(); ++index) | ||
+ | { | ||
+ | for (int position = 0; position < this->num_columns(); ++position) | ||
+ | { | ||
+ | std::cout << this->data.at(index).at(position) << " "; | ||
+ | } | ||
+ | std::cout << "\n"; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | template <class T> | ||
+ | void Matrix<T>::put_data(const std::vector <std::vector <T> > input_data) | ||
+ | { | ||
+ | data.clear(); | ||
+ | data.resize(input_data.size(), std::vector<T>(input_data.at(0).size())); | ||
+ | data = input_data; | ||
+ | } | ||
+ | |||
+ | template <class T> | ||
+ | Matrix<T>::Matrix() | ||
+ | { | ||
+ | |||
+ | } | ||
+ | |||
+ | template <class T> | ||
+ | int Matrix<T>::num_columns() | ||
+ | { | ||
+ | return data.at(0).size(); | ||
+ | } | ||
+ | |||
+ | template <class T> | ||
+ | int Matrix<T>::num_rows() | ||
+ | { | ||
+ | return data.size(); | ||
+ | } | ||
+ | |||
+ | template <class T> | ||
+ | void Matrix<T>::multiply_by_costant(T multiplier) | ||
+ | { | ||
+ | for (int index = 0; index < data.size(); ++index) | ||
+ | { | ||
+ | for (int position = 0; position < data.at(0).size(); ++position) | ||
+ | { | ||
+ | data.at(index).at(position) *= multiplier; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | template <class T> | ||
+ | void Matrix<T>::multiply_by_matrix_left(Matrix left_matrix) | ||
+ | { | ||
+ | if (left_matrix.num_columns() != this->num_rows()) | ||
+ | { | ||
+ | std::cout << "ERROR:SIZE MISMATCH\n"; | ||
+ | return; | ||
+ | } | ||
+ | std::vector <std::vector <T> > new_data; | ||
+ | new_data.resize(left_matrix.num_rows(), std::vector<T>(this->num_columns(), 0)); | ||
+ | for (int index = 0; index < new_data.size(); ++index) | ||
+ | { | ||
+ | for (int position = 0; position < new_data.at(0).size(); ++position) | ||
+ | { | ||
+ | for (int num = 0; num < left_matrix.num_columns(); ++num) | ||
+ | { | ||
+ | new_data.at(index).at(position) += left_matrix.data.at(index).at(num) * | ||
+ | this->data.at(num).at(position); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | this->data.clear(); | ||
+ | this->data = new_data; | ||
+ | } | ||
+ | |||
+ | template <class T> | ||
+ | void Matrix<T>::multiply_by_matrix_right(Matrix right_matrix) | ||
+ | { | ||
+ | if (this->num_columns() != right_matrix.num_rows()) | ||
+ | { | ||
+ | std::cout << "ERROR:SIZE MISMATCH\n"; | ||
+ | return; | ||
+ | } | ||
+ | std::vector <std::vector <T> > new_data; | ||
+ | new_data.resize(this->num_rows(), std::vector<T>(right_matrix.num_columns(), 0)); | ||
+ | for (int index = 0; index < new_data.size(); ++index) | ||
+ | { | ||
+ | for (int position = 0; position < new_data.at(0).size(); ++position) | ||
+ | { | ||
+ | for (int num = 0; num < this->num_columns(); ++num) | ||
+ | { | ||
+ | new_data.at(index).at(position) += this->data.at(index).at(num) * | ||
+ | right_matrix.data.at(num).at(position); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | this->data.clear(); | ||
+ | this->data = new_data; | ||
+ | } | ||
+ | |||
+ | |||
+ | int main() | ||
+ | { | ||
+ | Matrix<double> first_matrix, second_matrix; | ||
+ | std::vector <std::vector <double> > input_data; | ||
+ | input_data.resize(2, std::vector <double> (2, 0)); | ||
+ | input_data[0][0] = 1.; | ||
+ | input_data[1][0] = 2.; | ||
+ | input_data[0][1] = 3.; | ||
+ | input_data[1][1] = 1.; | ||
+ | |||
+ | first_matrix.put_data(input_data); | ||
+ | |||
+ | input_data[0][0] = 10; | ||
+ | second_matrix.put_data(input_data); | ||
+ | |||
+ | first_matrix.multiply_by_matrix_right(second_matrix); | ||
+ | first_matrix.transpose(); | ||
+ | // first_matrix.print(); | ||
+ | |||
+ | second_matrix.fill(10); | ||
+ | second_matrix.print(); | ||
+ | |||
+ | second_matrix.inverse(); | ||
+ | second_matrix.print(); | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | main.cpp | ||
+ | |||
+ | 1 из 1 | ||
+ | На экране: main.cpp. |
Версия 05:54, 13 марта 2014
МФТИ, ФУПМ
Кафедра "Интеллектуальные системы"
Направление "Интеллектуальный анализ данных"
Mailto: aduenko1@gmail.com
Отчеты о научно-исследовательской работе
Весна 2012, 6-й семестр
Выбор признаков и шаговая логистическая регрессия для задачи кредитного скоринга
Работа посвящена выбору оптимального набора признаков для определения уровня надеж- ности заемщиков, подавших заявку на банковский кредит. Для ответа на поставленный вопрос оценивается вероятность невозврата кредита. Для отбора признаков используется шаговая регрессия, исследуется зависимость информативности отобранных признаков от параметров шаговой регрессии. В вычислительном эксперименте алгоритм тестируется на данных потребителей, подававших заявки на кредиты в определенный банк, а также на данных об отклике клиентов на маркетинговую кампанию банка.
Публикация
- Адуенко А.А. Выбор признаков и шаговая логистическая регрессия для задачи кредитного скоринга // Машинное обучение и анализ данных. — 2012. — № 3. — С. 279-291. — ISSN 2223-3792.
Осень 2012, 7-й семестр
Выбор признаков и оптимизация метрики при кластеризации коллекции документов
Исследуется проблема верификации корректности тематической классификации документов с помощью метрического алгоритма. Предложен алгоритм выбора оптимальной функции расстояния между документами. Исследуется соответствие между полученной кластеризацией документов и их экспертной классификацией. Результаты кластеризации и их соответствие экспертной тематической классификации проиллюстрированы вычислительным экспериментом на реальной коллекции документов.'
Публикация
- А. А. Адуенко, А. А. Кузьмин, В. В. Стрижов Выбор признаков и оптимизация метрики при кластеризации коллекции документов // Известия ТулГУ.. — 2012. — № 3. — С. 119-131. — ISSN 2071-6141.
Визуализация матрицы парных расстояний между документами
В работе рассматривается алгоритм визуализации результатов тематической кластеризации коллекции документов. С помощью метода главных компонент матрица парных расстояний между документами оптимальным способом проецируется на плоскость. Предложена такая функция потерь, которая позволяет расположить название тем на плоскости с минимальным перекрытием. Алгоритм проиллюстрирован примером визуализации тезисов конференции.'
Публикация
- А. А. Адуенко, В. В. Стрижов Визуализация матрицы парных расстояний между документами // Научно-технические ведомости С.-Пб.ПГУ. — 2013. — № 1.
Алгоритм оптимального расположения названий коллекции документов
В работе исследуется метод визуализации результатов тематической кластеризации коллекции документов. Матрица парных расстояний между документами оптимальным способом спроецирована на плоскость. Требуется расположить названия документов оптимальным образом. Предложена такая функция потерь, которая позволяет расположить название тем на плоскости с минимальным перекрытием. Для ее минимизации использовался алгоритм BFGS. Алгоритм проиллюстрирован примером визуализации тезисов конференции.'
Публикация
- А. А. Адуенко, В. В. Стрижов Алгоритм оптимального расположения названий коллекции документов // Программная инженерия. — 2013. — № 3. — С. 21-25.
Весна 2013, 8-й семестр
Алгоритм построения логических правил при разметке текстов
В работе предложен метод восстановления структуры BibTeX: библиографических записей по их текстовому представлению. Структура ищется с помощью логических правил, определенных на экспертно-заданном множестве регулярных выражений. Для построения набора логических правил предполагается использовать алгоритм, основанный на тупиковых матрицах. Предложенный алгоритм проиллюстрирован задачей поиска структуры библиографических записей, представленных набором текстовых строк.'
Публикация
- А. В. Иванова, А. А. Адуенко, В. В. Стрижов Алгоритм построения логических правил при разметке текстов // Программная инженерия. — 2013. — № 6. — С. 41-47.
Совместный выбор объектов и признаков в задачах многоклассовой классификации коллекции документов
Работа посвящена задаче ранжирования поисковой выдачи. Для решения этой задачи предложен алгоритм многоклассовой классификации с совместным отбором объектов и признаков, а также его модификация для сравнения релевантности внутри одного класса. Отбор производится двумя способами: с помощью шаговой регрессии и с помощью генетических алгоритмов. Результаты, полученные разными методами, сравниваются. Алгоритм тестируется на синтетических данных и данных поисковой выдачи Яндекса.
Публикация
- А. А. Адуенко, В. В. Стрижов Совместный выбор объектов и признаков в задачах многоклассовой классификации коллекции документо // Инфокоммуникационные технологии. — 2013. — № 4.
О предельных движениях волчка с внутренней диссипацией в однородном поле тяжести
Рассматривается волчок, моделируемый несущим телом с неподвижной точкой и однородным шаром, помещенным в шаровую полость несущего тела такого же радиуса, как и радиус шара. Предполагается, что диссипация обеспечивается только за счет внутренних сил, возникающих при относительных перемещениях шара. Показано, что предельными движениями волчка являются только стационарные вращения вокруг вертикали. Для случая, когда центр масс волчка лежит на одной из главных осей инерции, определено все множество предельных движений и детально исследован характер их устойчивости. Установлено, что для симметричного волчка с внутренней диссипацией условие устойчивости вращений, для которых радиус-вектор центра масс волчка направлен вертикально вверх, отличается от условия Майевского.
Публикация
- А. А. Адуенко, Н. И. Амелькин О предельных движениях волчка с внутренней диссипацией в однородном поле тяжести // Труды МФТИ. — 2013. — № 18(2). — С. 126-133.
Осень 2013, 9-й семестр
АСИМПТОТИЧЕСКИЕ СВОЙСТВА ДВИЖЕНИЙ ТЯЖЕЛОГО ВОЛЧКА С ВНУТРЕННЕЙ ДИССИПАЦИЕЙ
Рассматриваются предельные движения тяжелого волчка, моделируемо го системой твердых тел, при наличии внутреннего трения. Определено все множество предельных движений и детально исследован характер их устойчивости для случаев, когда несомое тело волчка имеет а) три и б) одну степень свободы относительно несущего тела. Результаты анализа случая а распространяются на движения волчка с жидким наполнением. Для случая б определены значения параметров, при которых волчок помимо стацио нарных вращений имеет нестационарные предельные движения, представ ляющие собой интегрируемые движения в частном случае Бобылева–Стек лова.
Публикация
- А. А. Адуенко, Н. И. Амелькин Асимптотические свойства движений тяжелого волчка с внутренней диссипацией // Прикладная математика и механика. — 2014. — № 1.
Object selection in credit scoring using covariance matrix of parameters estimations
To construct a bank credit scoring model one must select a set of informative objects (clients) to get an unbiased estimation of the model parameters. The authors propose an object selection algorithm. It is based on analysis of the covariance matrix for the parameters estimations. The computational experiment shows statistical significance of the classification quality improvement. The algorithm is illustrated with the cash loans and heart disease data sets.'
Публикация
- Alexander A. Aduenko, Vadim V. Strijov Object selection in credit scoring using covariance matrix of parameters estimations // Computational Statistics and Data Analysis. — 2014.
Generalization of the sorption process of porous materials
In this paper we present an approach for the generalization of sorption of gas in any porous framework. Our approach allows the determination of gas uptake considering only geometrical characteristics of the framework and interaction energy of the guest molecule with the framework. The derivation of this general equation for the uptake of any crystalline porous framework is presented. Based on this theory, we calculated optimal values for the adsorption enthalpy at different temperatures and pressures. We also present the use of this theory to determine the optimal linker length for a topological equivalent framework series. We validate this theoretical approach by comparing the predicted uptake to experimental values for MOF-5, MOF-14, MOF-177, MOF-200, SNU-77H and Li-metalated MOF-177 and MOF-200. We obtained the universal recipe for optimal linker length given a topology of a porous framework. We believe that these guidelines will be useful for designing new porous materials for practical molecular hydrogen storage.'
Публикация
- Jose L. Mendoza-Cortes, Alexander A. Aduenko Generalization of the sorption process of porous materials // Phys. Rev. B. — 2014.
Участие в конференциях
- 55я Конференция МФТИ, доклад "Динамика волчка с частичной внутренней диссипацией".
- 56я Конференция МФТИ, доклад "О резонансных движениях маятника с вибрирующей точкой подвеса".
Диск Использовано 6,62 ГБ (44%) из 15 ГБНастройки
Заголовок
Владелец
Последнее изменение Сегодня 0:08 Вы добавили 1 объект C++ main.cpp За прошлую неделю марта 05 Вы открыли доступ к 1 объекту Postscript map_tryyy.eps Может просматривать Vadim Strijov A Может просматривать Anastasia Motrenko марта 04 Вы добавили 1 объект Postscript map_tryyy.eps марта 04 Вы добавили 1 объект Папка Google Диска SAR За прошлый месяц февр. 26 Вы отредактировали 1 объект Google Таблицы Новая таблица февр. 23 Вы открыли доступ к 1 объекту Архив Articles.zip Может просматривать Пользователи, у которых есть ссылка февр. 23 Вы добавили 2 объекта Архив Articles.zip PDF advanced-economicsciences2013.pdf В прошлом году янв. 08 Вы открыли доступ к 1 объекту Архив Разжевайкин.zip Может просматривать Пользователи, у которых есть ссылка янв. 08 Вы добавили 1 объект Архив Разжевайкин.zip 20 дек. 2013 г. Вы открыли доступ к 1 объекту PDF B1Beg_LB_Kap01-04.pdf Может просматривать Пользователи, у которых есть ссылка 20 дек. 2013 г. Вы добавили 3 объекта PDF B1Beg_LB_Kap01-04.pdf PDF thesis.pdf Изображение DSC_0841.JPG
- include <iostream>
- include <vector>
- include <algorithm>
- include <math.h>
template <class T> class Matrix { public:
std::vector <std::vector <T> > data; Matrix(); int num_columns(); int num_rows(); void multiply_by_costant(T multiplier); void multiply_by_matrix_left(Matrix left_matrix); void multiply_by_matrix_right(Matrix right_matrix); void put_data(const std::vector <std::vector <T> > input_data); void print(); void transpose(); void inverse(); void fill(int size);
};
template <class T> void Matrix<T>::fill(int size) {
data.clear(); data.resize(size); for (int index = 0; index < size; ++index) { data.at(index).resize(size); for (int position = 0; position < size; ++position) { data.at(index).at(position) = rand() % 100; } }
}
template <class T> void Matrix<T>::inverse() {
int N = data.size(); int rn[N],cn[N]; int j, k;
for(j=N;j--;) { rn[j]=cn[j]=j; } double gaus_minved = 1e99; long double gaus_deter=1; int gaus_ostatok; for(gaus_ostatok=N; gaus_ostatok; gaus_ostatok--) { int jved,kved; double vved=-1; double t;
// ���������� ���������������� for(j=N;j--;) { // std::cout << j << "\n"; if(~rn[j]) { for(k=N;k--;) if(~cn[k]) { if(vved<fabs(data[j][k])) { vved=fabs(data[j][k]); jved=j; kved=k; } } } }
if(gaus_minved > vved) { gaus_minved=vved; } gaus_deter *= data[jved][kved]; if(vved<1e-99) { for(j=N;j--;) { if(~rn[j]) { for(k=N;k--;) { data[j][k] = NAN; } } if(~cn[j]) { for(k=N;k--;) { data[k][j] = NAN; } } } return; }
int jt=rn[jved],kt=cn[kved];
// ������������������������ for(j=N;j--;) { t=data[kt][j]; data[kt][j]=data[jved][j]; data[jved][j]=t; } for(j=N;j--;) { t=data[j][jt]; data[j][jt]=data[j][kved]; data[j][kved]=t; }
rn[jved]=rn[kt]; cn[kved]=cn[jt]; rn[kt]=cn[jt]=-1;
vved=data[kt][jt]; data[kt][jt]=1; for(j=N;j--;) { if(j==kt) { continue; } double mul=data[j][jt]/vved; data[j][jt]=0; for(k=N;k--;) { data[j][k]-=data[kt][k]*mul; } // ���������� �������������������� �������� ���������� N^3 ���������������� } for(k=N;k--;) { data[kt][k] /= vved; } }
// for (int i = 0; i < N; ++i) // { // for (int j = 0; j < N; ++j) // { // std::cout << m[i][j] << " "; // } // } }
template <class T> void Matrix<T>::transpose() {
std::vector <std::vector <T> > new_data = this->data; for (int index = 0; index < new_data.at(0).size(); ++index) { for (int position = 0; position < new_data.size(); ++position) { this->data.at(index).at(position) = new_data.at(position).at(index); } }
}
template <class T> void Matrix<T>::print() {
for (int index = 0; index < this->num_rows(); ++index) { for (int position = 0; position < this->num_columns(); ++position) { std::cout << this->data.at(index).at(position) << " "; } std::cout << "\n"; }
}
template <class T> void Matrix<T>::put_data(const std::vector <std::vector <T> > input_data) {
data.clear(); data.resize(input_data.size(), std::vector<T>(input_data.at(0).size())); data = input_data;
}
template <class T> Matrix<T>::Matrix() {
}
template <class T> int Matrix<T>::num_columns() {
return data.at(0).size();
}
template <class T> int Matrix<T>::num_rows() {
return data.size();
}
template <class T> void Matrix<T>::multiply_by_costant(T multiplier) {
for (int index = 0; index < data.size(); ++index) { for (int position = 0; position < data.at(0).size(); ++position) { data.at(index).at(position) *= multiplier; } }
}
template <class T> void Matrix<T>::multiply_by_matrix_left(Matrix left_matrix) {
if (left_matrix.num_columns() != this->num_rows()) { std::cout << "ERROR:SIZE MISMATCH\n"; return; } std::vector <std::vector <T> > new_data; new_data.resize(left_matrix.num_rows(), std::vector<T>(this->num_columns(), 0)); for (int index = 0; index < new_data.size(); ++index) { for (int position = 0; position < new_data.at(0).size(); ++position) { for (int num = 0; num < left_matrix.num_columns(); ++num) { new_data.at(index).at(position) += left_matrix.data.at(index).at(num) * this->data.at(num).at(position); } } } this->data.clear(); this->data = new_data;
}
template <class T> void Matrix<T>::multiply_by_matrix_right(Matrix right_matrix) {
if (this->num_columns() != right_matrix.num_rows()) { std::cout << "ERROR:SIZE MISMATCH\n"; return; } std::vector <std::vector <T> > new_data; new_data.resize(this->num_rows(), std::vector<T>(right_matrix.num_columns(), 0)); for (int index = 0; index < new_data.size(); ++index) { for (int position = 0; position < new_data.at(0).size(); ++position) { for (int num = 0; num < this->num_columns(); ++num) { new_data.at(index).at(position) += this->data.at(index).at(num) * right_matrix.data.at(num).at(position); } } } this->data.clear(); this->data = new_data;
}
int main()
{
Matrix<double> first_matrix, second_matrix; std::vector <std::vector <double> > input_data; input_data.resize(2, std::vector <double> (2, 0)); input_data[0][0] = 1.; input_data[1][0] = 2.; input_data[0][1] = 3.; input_data[1][1] = 1.;
first_matrix.put_data(input_data);
input_data[0][0] = 10; second_matrix.put_data(input_data);
first_matrix.multiply_by_matrix_right(second_matrix); first_matrix.transpose(); // first_matrix.print();
second_matrix.fill(10); second_matrix.print();
second_matrix.inverse(); second_matrix.print();
return 0;
} main.cpp
1 из 1 На экране: main.cpp.
Категории: Адуенко А.А. (публикации) | 2012 (публикации) | Машинное обучение и анализ данных (статьи) | А. А. Адуенко, А. А. Кузьмин, В. В. Стрижов (публикации) | Известия ТулГУ. (статьи) | А. А. Адуенко, В. В. Стрижов (публикации) | 2013 (публикации) | Научно-технические ведомости С.-Пб.ПГУ (статьи) | Программная инженерия (статьи) | А. В. Иванова, А. А. Адуенко, В. В. Стрижов (публикации) | Инфокоммуникационные технологии (статьи) | А. А. Адуенко, Н. И. Амелькин (публикации) | Труды МФТИ (статьи) | 2014 (публикации) | Прикладная математика и механика (статьи) | Alexander A. Aduenko, Vadim V. Strijov (публикации) | Computational Statistics and Data Analysis (статьи) | Jose L. Mendoza-Cortes, Alexander A. Aduenko (публикации) | Phys. Rev. B (статьи)