Polytech-soft.com

ПК журнал
4 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Транспонирование матрицы java

Транспонирование матрицы java

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

Популярным примером использования такого рода массивов, являются матрицы, для представления которых, используются двумерные массивы. Итак, что же такое матрица и как ее представить с помощью двумерного массива в Java.

Матрицы и двумерные массивы в Java

Матрица это прямоугольная таблица, состоящая из строк и столбцов на пересечении которых находятся её элементы. Количество строк и столбцов матрицы задают ее размер.

Общий вид матрицы размером m x n ( m — количество строк, n — количество столбцов), выглядит следующим образом:

Каждый элемент матрицы имеет свой индекс, где первая цифра обозначает номер строки на которой находится элемент, а вторая — номер столбца.

Рассмотрим примеры конкретных матриц и создадим их с помощью Java.

Матрица A имеет размерность 2 на 3 (2 строки, 3 столбца). Создадим двухмерный массив этой размерности:

Мы объявили двумерный массив целых чисел (поскольку матрица в данном случае содержит целые числа) и зарезервировали для него память. Для этого мы использовали 2 индекса: первый индекс определяет строку и ее размер, второй индекс определяет столбец и его размер.

Далее будем инициализировать массив поэлементно. Запишем матрицу A в виде таблицы, чтобы было визуально понятно, какому индексу соответствует элемент.

Для доступа к элементам двумерного массива необходимо использовать 2 индекса: первый для строки, второй – для столбца. Как и в случае с одномерными массивами, индексы также начинаются с нуля. Поэтому нумерация строк и столбцов в таблице начинается с 0.

Для того, чтобы вывести матрицу на консоль, нужно пройти все элементы, используя два цикла. Количество циклов, при прохождении элементов массива, равно его размерности. В нашем случае первый цикл осуществляется по строкам, второй — по столбцам.

То есть, сначала выводим все элементы первой строки, отделяя их символом табуляции » t», переносим строку и выводим все элементы второй строки.

Полностью код для матрицы А выглядит следующим образом:

Для матрицы B воспользуемся упрощенным способом инициализации — в момент объявления. По аналогии с одномерными массивами.

Каждую строку массива необходимо заключить в пару фигурных скобок и отделить друг от друга запятой.

Полностью код для матрицы B:

Рассмотрим инициализацию в цикле для двумерного массива на примере таблицы умножения.

Здесь инициализация элементов значениями таблицы умножения совмещена с их выводом на консоль в одном цикле.

Многомерные и несимметричные массивы.

Создаются многомерные массивы в Java аналогичным способом. Количество квадратных скобок указывает на размерность.
Примеры создания массивов фиксированной длины:

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

Читать еще:  Java tm 6 update что это

В данном случае, пока неизвестно сколько будет элементов в каждой строке, это можно определить позже, причем, массив может содержать в каждой строке разное количество элементов, то есть быть несимметричным. Определим количество элементов в каждой строке для массива a1

В результате, при выводе на экран,

массив будет иметь такой вид:

0
0 0
0 0 0
0 0 0 0
0 0 0 0 0

При создании массива его элементы автоматически инициализируются нулями, поэтому в это примере на экран выведены нули.

Транспонирование матрицы в Java

Данная статья написана командой Vertex Academy. Это одна из статей из нашего «Самоучителя по Java.»

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

Решение:

Часть 1 — создаем матрицу n на n и заполняем ее значениями с помошью цикла. При желании можно сделать так, чтобы число n задавалось пользователем с консоли. Не бойтесь цикла

Вы увидите, что выражение » a[i][j] = n*i + j » просто заполняет массив по порядку числами , начиная с 0. Часть 2 — выводит на экран двухмерную матрицу с помощью двух массивов. «%4d» значит «4 пробела». Так, «%3d» — это 3 пробела, «%6d» — 6 пробелов, и т.д.

Часть 3 — транспонирование матрицы. Это «переворачивание» матрицы:

А еще во время транспонирования номер столбца и номер строки «меняются местами». Например, было a[1] [9], стало a[9][1]. И так со всеми элементами (a[2] [2], конечно, остается a[2][2]). Этим и пользуются для того, чтобы транспонировать матрицу в этом примере:

a[i][j] и a[j][i] меняются местами с помощью переменной temp (temporary — временный).

Часть 4 — выводим транспонированную матрицу на экран. Повторяет часть 2.

Надеемся — наша статья была Вам полезна. Есть возможность записаться на наши курсы по Java. Детальную информацию смотрите у нас на сайте.

Транспонирование матрицы java

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

Популярным примером использования такого рода массивов, являются матрицы, для представления которых, используются двумерные массивы. Итак, что же такое матрица и как ее представить с помощью двумерного массива в Java.

Матрицы и двумерные массивы в Java

Матрица это прямоугольная таблица, состоящая из строк и столбцов на пересечении которых находятся её элементы. Количество строк и столбцов матрицы задают ее размер.

Общий вид матрицы размером m x n ( m — количество строк, n — количество столбцов), выглядит следующим образом:

Читать еще:  Как обновить java

Каждый элемент матрицы имеет свой индекс, где первая цифра обозначает номер строки на которой находится элемент, а вторая — номер столбца.

Рассмотрим примеры конкретных матриц и создадим их с помощью Java.

Матрица A имеет размерность 2 на 3 (2 строки, 3 столбца). Создадим двухмерный массив этой размерности:

Мы объявили двумерный массив целых чисел (поскольку матрица в данном случае содержит целые числа) и зарезервировали для него память. Для этого мы использовали 2 индекса: первый индекс определяет строку и ее размер, второй индекс определяет столбец и его размер.

Далее будем инициализировать массив поэлементно. Запишем матрицу A в виде таблицы, чтобы было визуально понятно, какому индексу соответствует элемент.

Для доступа к элементам двумерного массива необходимо использовать 2 индекса: первый для строки, второй – для столбца. Как и в случае с одномерными массивами, индексы также начинаются с нуля. Поэтому нумерация строк и столбцов в таблице начинается с 0.

Для того, чтобы вывести матрицу на консоль, нужно пройти все элементы, используя два цикла. Количество циклов, при прохождении элементов массива, равно его размерности. В нашем случае первый цикл осуществляется по строкам, второй — по столбцам.

То есть, сначала выводим все элементы первой строки, отделяя их символом табуляции » t», переносим строку и выводим все элементы второй строки.

Полностью код для матрицы А выглядит следующим образом:

Для матрицы B воспользуемся упрощенным способом инициализации — в момент объявления. По аналогии с одномерными массивами.

Каждую строку массива необходимо заключить в пару фигурных скобок и отделить друг от друга запятой.

Полностью код для матрицы B:

Рассмотрим инициализацию в цикле для двумерного массива на примере таблицы умножения.

Здесь инициализация элементов значениями таблицы умножения совмещена с их выводом на консоль в одном цикле.

Многомерные и несимметричные массивы.

Создаются многомерные массивы в Java аналогичным способом. Количество квадратных скобок указывает на размерность.
Примеры создания массивов фиксированной длины:

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

В данном случае, пока неизвестно сколько будет элементов в каждой строке, это можно определить позже, причем, массив может содержать в каждой строке разное количество элементов, то есть быть несимметричным. Определим количество элементов в каждой строке для массива a1

В результате, при выводе на экран,

массив будет иметь такой вид:

0
0 0
0 0 0
0 0 0 0
0 0 0 0 0

При создании массива его элементы автоматически инициализируются нулями, поэтому в это примере на экран выведены нули.

Транспонирование матрицы java

251 просмотра

3 ответа

36 Репутация автора

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

Читать еще:  Работа графиками java

Мой подход заключается в назначении равных частей структуры double [] [], в данном случае 2 x 2, каждому из четырех потоков. В данном случае это означает стартовые позиции 0,0 и 0,2, 2,0 и 2,2. Это передается с помощью «kol» и «rad».

Однако я не могу заставить это работать на больших матрицах, поэтому любая помощь будет принята с благодарностью. Ближайший ответ на эту проблему я нашел здесь: Как распараллелить транспонирование матрицы?

Это также мое вдохновение для разделения структуры double [] [] на четыре части. Мой (рабочий) код 4 x 4 можно найти ниже, так как я могу изменить его для работы с четырьмя потоками?

PS: я знаю, что код работает правильно, потому что у меня есть метод проверки на работающий последовательный вариант.

Ответы (3)

2 плюса

20235 Репутация автора

Это априори проигранный бой с O(N^2) функцией затрат

Если я могу обратить ваше внимание на более разумный подход с почти O(1) (постоянными) затратами, уловка поможет вам начать работать в более перспективном направлении.

Можно попытаться добавить один тонкий слой абстракции над настроенным высокопроизводительным хранилищем («сырое» хранилище матричных элементов, дружественное к строкам кэша). Этот абстрактный слой поможет получить доступ к «сырому» хранилищу (используя оси индексации, index- Трюки с нарезкой и нарезкой — точно так же, как библиотеки HPC FORTRAN вдохновили известные numpy и наглядные трюки), и таким образом .T -метод не будет делать ничего дорогого (например, разбрасывать области N^2 памяти с помощью бульдозеров , менять местами и обратно), а просто менять местами оси параметры в абстрактном уровне, ответственные за картограф, косвенным , принимая несколько десятков наносекунд для любого большого matrise[N,N]; where N = 10, 100, 1000, 10000, 100000, 1000000, 10000000+ еще несколько [ns] .

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

1 плюс

401 Репутация автора

Возможно, может быть простой идеей использовать поток, чтобы поменять строку на столбец, но поэтому вам нужно вдвое больше памяти для вашей матрицы, что может быть проблемой для огромных матриц. Кроме того, если у вас 6-ядерный процессор, я думаю, что использование 100 потоков не принесет особой пользы, поэтому мой пул потоков очень мал. И как @ user3666197 упомянул, что это все еще дорогое решение — но параллель 😉

Автор: IEE1394 Размещён: 01.03.2018 11:03

плюса

401 Репутация автора

на основе подхода user3666197 вы можете сделать что-то вроде этого:

Ссылка на основную публикацию
Adblock
detector