Polytech-soft.com

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

Транспонировать матрицу java

Транспонирование матрицы в 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.

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

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

Читать еще:  Вывод матрицы java

Далее будем инициализировать массив поэлементно. Запишем матрицу 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 для правильной работы.

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

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

Читать еще:  Что значит ошибка 103

Это также мое вдохновение для разделения структуры 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 вы можете сделать что-то вроде этого:

как транспонировать матрицу по ссылке в java

Я пытаюсь транспонировать матрицу по ссылке, но безуспешно, матрица в основном остается в том же состоянии. что я могу сделать?

p. s. функция должна быть «void»

2 Ответа

Главная ошибка-это линия

Здесь вы присваиваете ссылку на массив b ссылке на массив a (эта ссылка является локальной переменной).

Либо вы должны скопировать массив вместо назначения ссылки, либо вы должны использовать начальный массив a внутри цикла. Конечно, все это возможно, если матрица квадратична ( n x n ).

Читать еще:  Обновить версию java

Копирование массива (неэффективный способ!) будет выглядеть так:

Обработка внутри массива будет выглядеть так:

Кроме того, в настоящее время неизменяемое поведение предпочтительнее изменяемых массивов, поэтому вы можете заставить свою функцию возвращать новый массив вместо мутирования старого (решение, которое вы можете найти внутри ответа @AlexFitzpatrick’s).

Как последняя мысль, вы можете передать ссылку на массив в метод. Это может быть достигнуто с помощью некоторой обертки или с помощью встроенного AtomicReference .

Тогда ваш метод будет принимать не int[][] , а AtomicReference , так что это, наконец, будет выглядеть так:

Ваша последняя строка в функции trans не заменяет значение исходного массива, она просто переназначает указатель параметра в этой функции.

Самое простое решение-вернуть новый массив.

Похожие вопросы:

У меня проблема с использованием библиотеки sympy. Я хочу транспонировать матрицу, но это не работает. Мой код-это x = Symbol(‘x’) y = Symbol(‘y’) J =.

Я сделал матрицу 8×8, используя c#,, и теперь мне нужно транспонировать матрицу. Вы можете помочь мне перенести матрицу? Это моя матрица public double[,] MatriksT(int blok) < double[,] matrixT = new.

Мой вопрос тесно связан с этим вопросом, но я ищу решение в Javascript Как транспонировать матрицу 2D, хранящуюся в виде массива C 1D В основном у меня есть квадратная матрица 2D 1 2 3 4 5 6 7 8 9.

У меня есть матрица, которую я пытаюсь транспонировать в R, но функция t() не возвращает правильный ответ. Как я могу транспонировать матрицу? > xx=matrix(c(3,7,4,8),2,byrow=TRUE) > xx [,1].

Я новичок в библиотеке C++ Boost uBLAS, поэтому у меня есть вопрос noob — как транспонировать матрицу с помощью этой библиотеки? Я не мог найти здесь вопроса.

Я новичок в F#. Я хочу транспонировать матрицу, я могу сделать это с циклами, как и на любом другом языке,но я хочу сделать это без циклов. Моя Матричная Декларация : let.

Есть ли у кого-нибудь функция, с помощью которой я могу транспонировать матрицу в Java, которая имеет следующий вид: double[][] У меня есть такая функция: public static double[][].

Как я могу транспонировать матрицу в ADA?. Я пробовал: procedure transpose(A: in out matrix) is B : matrix(1..A’Last(2),1..A’Last(1)); begin for i in A’Range(1) loop for j in A’Range(2) loop.

Я довольно новичок в Prologue, и одно из моих первых заданий в классе-транспонировать матрицу в Prolog, что означает: если у меня есть матрица A=[[1,2,3],[4,5,6],[7,8,9]] Я должен получить другую.

Я знаю, что есть функция на R, которая позволяет вам транспонировать любую матрицу, но мне было интересно, как я буду транспонировать матрицу без использования этого (т. е. создание собственной.

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