Возведение матрицы в степень методом JAVA
но возврат WAYYY выключен. Только первый (1,1) элемент матрицы находится в точке.
Я пытался использовать этот метод в основном так
// Multiplying matrices for (i = 0; i < row; i++) < for (j = 0; j < column; j++) < for (l = 0; l < row; l++) < sum += matrix[i][l] * matrix[l][j] ; >matrix[i][j] = sum ; sum = 0 ; > > // Solving Power of matrix for (i = 0; i
Где «мощность», «строка» и «столбец» — это целое число, которое вводит пользователь.
Любые идеи, как я могу это сделать?
Вы пытаетесь возвести матрицу в степень, например, для матрицы M «N = M ^ p»? Или вы пытаетесь воздействовать на каждый отдельный элемент матрицы и просто независимо возводить их в степень? — Jason C
в основном МMМ, для м^3 — user3124548
2 ответы
Во-первых, ваш алгоритм возведения в квадрат матрицы имеет (общую) ошибку. У вас есть:
for (i = 0; i < row; i++) < for (j = 0; j < column; j++) < for (l = 0; l < row; l++) < sum += matrix[i][l] * matrix[l][j] ; >matrix[i][j] = sum ; sum = 0 ; > >
Однако вам нужно сохранить результат во временной второй матрице, потому что когда вы делаете matrix[i][j] = sum , он заменяет значение в этой позиции выводом, после чего более поздние результаты оказываются неверными. Также я предлагаю инициализировать sum в 0 первый, так как кажется, что вы объявляете его вне этого цикла, и его инициализация сначала защищает вас от любого произвольного значения sum может иметь перед входом в цикл. Кроме того, не сразу понятно, что вы имеете в виду под row и column — убедитесь, что вы перебираете всю матрицу. Например:
int temp[][] = new int[matrix.length]; for (i = 0; i < matrix.length; i++) < temp[i] = new int[matrix[i].length]; for (j = 0; j < matrix[i].length; j++) < sum = 0 ; for (l = 0; l < matrix.length; l++) < sum += matrix[i][l] * matrix[l][j] ; >temp[i][j] = sum ; > > // the result is now in 'temp', you could do this if you wanted: matrix = temp;
Обратите внимание, что matrix.length и matrix[i].length достаточно взаимозаменяемы выше, если матрица квадратная (какой она должна быть, чтобы ее можно было умножить на себя).
Во-вторых, ваше умножение квадраты матрица. Это означает, что если вы неоднократно применяете его, вы продолжаете возводить матрицу в квадрат каждый раз, а это означает, что вы сможете вычислить только степени, которые сами являются степенями двойки.
Ваша третья проблема — ваш последний бит не имеет большого смысла:
Не сразу понятно, что вы пытаетесь здесь сделать. Заключительная часть, кажется, пытается возвысить отдельные элементы до определенной степени. Но это не то же самое, что возведение матрицы в степень.
Что вы необходимость нужно определить правильный метод умножения матриц, который может умножать две произвольные матрицы, например:
int[][] multiplyMatrices (int[][] a, int[][] b) < // compute and return a x b, similar to your existing multiplication // algorithm, and of course taking into account the comments about // the 'temp' output matrix above >
Тогда вычисление мощности становится простым:
int[][] powerMatrix (int[][] a, int p)
Возведение квадратной матрицы в степень
Возведение матрицы в степень
Добрый день. Не так давно начал изучать Java. И вот наткнулся на проблему. Задача: Дана Квадратная.
Возведение квадратной матрицы в заданную целочисленную степень (в виде модуля)
Добрый день! Задание формулируется следующим образом: разработать программу для возведения.
Реализовать возведение квадратной матрицы в степень, где показатель степени — заданный вектор
Даны квадратная матрица A порядка n и вектор b с n элементами. Получить вектор A^2b. Помогите.
Возведение числа в степень за минимальное количество умножений, не используя возведение в степень (в чем ошибка?)
должно число подводиться в степень за минимальное кол умножения не используя возведение в степень.
for (int k = 0; k Graph.length; k++){ Res[i][j] += Graph[i][k] * matrix[k][j]; }
dimadima2, не следует впихивать в методы всё, что ни попадя. Если метод должен возводить в степень то пусть этим и занимается. Пишите проще. Как вариант:
public static int[][] power(int[][] matrix, int n) { int[][] output = new int[matrix.length][matrix.length]; for (int i = 0; i matrix.length; i++) { for (int j = 0; j matrix.length; j++) { output[i][j] = (int) Math.pow(matrix[i][j], n); } } return output; }
Выводом в файл пусть занимается другой метод. Вам же будет проще находить ошибки и локализовать их источник.
HOBATOP, возведение матрицы в степень это не возведение в степень её элементов. Это умножение матрицы саму на себя N раз.
KEKCoGEN, да, чего-то затупил, бывает 🙂 День выдался непростой вот и не догнал, что спрашивают за матрицу в математическом смысле, а не за двухмерный массив.
Однако же остаюсь при своём мнении: не для чего в метод пихать всякую всячину. Что касается решения, то вот возможный вариант:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
public static void main(String[] args) { int pow = 4; int[][] input = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int[][] clone = input; int[][] output = new int[input.length][input.length]; for (int i = 0; i pow - 1; i++) { output = power(input, clone); clone = output; } for (int[] temp : output) { for (int tmp : temp) { System.out.printf("%7d", tmp); } System.out.println(); } } public static int[][] power(int[][] input, int[][] clone) { int[][] output = new int[input.length][input.length]; for (int j = 0; j input.length; j++) { for (int k = 0; k input.length; k++) { for (int l = 0; l input.length; l++) { output[j][k] += input[j][l] * clone[l][k]; } } } return output; }
Возведение матрицы в степень методом JAVA
Но возврат ПУТЬ выключен. Только первый (1,1) матричный элемент находится на точке.
Я пробовал использовать этот метод в основном так
// Multiplying matrices for (i = 0; i < row; i++) < for (j = 0; j < column; j++) < for (l = 0; l < row; l++) < sum += matrix[i][l] * matrix[l][j] ; >matrix[i][j] = sum ; sum = 0 ; > > // Solving Power of matrix for (i = 0; i
Где «мощность», «строка» и «столбец» — это целое число, которое вводит пользователь.
Любые идеи, как я могу это сделать?
Вы пытаетесь поднять матрицу до степени, например. для матрицы M, «N = M^p»? Или вы пытаетесь воздействовать на каждый отдельный элемент матрицы и просто независимо возводить их в степень?
2 ответа
У вас здесь много проблем.
Во-первых, ваш алгоритм возведения матрицы в квадрат имеет (общую) ошибку. У тебя есть:
for (i = 0; i < row; i++) < for (j = 0; j < column; j++) < for (l = 0; l < row; l++) < sum += matrix[i][l] * matrix[l][j] ; >matrix[i][j] = sum ; sum = 0 ; > >
Однако вам необходимо сохранить результат во временной второй матрице, потому что, когда вы выполняете matrix[i][j] = sum , он заменяет значение в этой позиции выводом, тогда последующие результаты оказываются неверными. Также я предлагаю инициализировать sum значением 0 сначала , поскольку кажется, что вы объявляете его вне этого цикла, и инициализация сначала защищает вас от любого произвольного значения, которое может иметь sum перед тем, как в петлю. Кроме того, не сразу понятно, что вы имеете в виду под row и column — убедитесь, что вы выполняете итерацию по всей матрице. Например.:
int temp[][] = new int[matrix.length]; for (i = 0; i < matrix.length; i++) < temp[i] = new int[matrix[i].length]; for (j = 0; j < matrix[i].length; j++) < sum = 0 ; for (l = 0; l < matrix.length; l++) < sum += matrix[i][l] * matrix[l][j] ; >temp[i][j] = sum ; > > // the result is now in 'temp', you could do this if you wanted: matrix = temp;
Обратите внимание, что matrix.length и matrix[i].length в значительной степени взаимозаменяемы выше, если матрица квадратная (что должно быть, чтобы умножить на себя).
Во-вторых, ваше умножение возводит в квадрат матрицу. Это означает, что если вы многократно применяете его, вы будете каждый раз возводить матрицу в квадрат, что означает, что вы сможете вычислять только степени, которые сами по себе являются степенями двойки.
Третья проблема — последний бит не имеет особого смысла:
Не сразу понятно, что вы здесь пытаетесь сделать. Заключительная часть, кажется, пытается поднять отдельные элементы до определенной мощности. Но это не то же самое, что возведение матрицы в степень.
Что вам нужно сделать, так это определить правильный метод умножения матриц, который может умножать две произвольные матрицы, например:
int[][] multiplyMatrices (int[][] a, int[][] b) < // compute and return a x b, similar to your existing multiplication // algorithm, and of course taking into account the comments about // the 'temp' output matrix above >
Тогда вычисление мощности становится простым:
int[][] powerMatrix (int[][] a, int p)
Если я правильно понимаю ваш алгоритм, вы на самом деле возводите каждую матрицу в степень n+1 , а не в степень n . Посмотрите внимательно на свой метод powerMatrix .
need Help на возведение матриц в степень
Всем привет! Возникли трудности с возведением матрицы в степень. Помогите пожалуйста! Дан двумерный массив, необходим возвести в степень n. int[][] matrix = , >;
Этой функции хватит? Если нужно и в отрицательную степень возводить, то нужно еще и обратную матрицу находить
public static int[][] prod(int[][] a, int[][] b) < // предполагается, что a и b - квадратные матрицы одного размера int n = a.length; int[][] c = new int[n][n]; for (int i = 0; i < n; i++) < for (int j = 0; j < n; j++) < for (int k = 0; k < n; k++) < c[i][j] += a[i][k] * b[k][j]; >> > return c; >
JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.
Как возводить в степень в Java?
В этой статье мы расскажем о том, как выполнять возведение в степень в языке программирования Java. Читателю будут представлены 5 актуальных способов решения поставленной задачи.
Но прежде чем мы приступим к перечислению способов, давайте для начала вспомним, что же вообще представляет собой операция возведения:
Таким образом, речь идет об умножении числа на свое же значение n-е количество раз. Умножаемое число — это основание степени, а количество операций по умножению — показатель. Результат такого перемножения и будет называться возведением в степень. Для числа 3 3 результат будет равен 27, так как 3 х 3 х 3 = 27.
Теперь давайте рассмотрим, как это все реализуется в языке программирования Java.
Math pow
Использование класса Math — наиболее простой вариант решения поставленной задачи. На практике его применяют в большинстве ситуаций. Public class Math включает в себя математические методы, в том числе те, которые связаны с геометрией и тригонометрией. В этом классе методы реализованы в качестве статических, следовательно, есть возможность вызывать их через имя класса Math, не создавая объект класса.
public static int pow(int value, int powValue)
return (int) Math.pow(value, powValue);
Здесь пришлось использовать операцию приведения типа (int), т. к. этот метод класса Math осуществляет возвращение значения типа double (аргументы, по сути, тоже double , однако там применяется неявное приведение типа).
Теперь рассмотрим несколько дополнительных вариантов решения поставленной задачи.
Значение квадрата числа
Начнем с наиболее простого и напишем метод по возведению в квадрат:
public static void main(String[] args)
Как видим, возведение в квадрат сложностей не вызывает.
Число в степени
Чаще всего нам приходится работать не с квадратным значением числа, а с числом в определенной степени. Усложним предыдущий вариант и задействуем кастомное Java pow-значение:
public static void main(String[] args)
public static int pow(int value, int powValue)
int result = 1;
for (int a = 1; а
return result;
Алгоритм несложен: мы как будто задаем точку отсчета result , а потом умножаем его на значение value столько, сколько будет работать цикл с powValue .
Рекурсия
Следующий вариант является уже более экзотичным.
Вы должны знать, что рекурсия позволяет методу осуществлять вызов самого себя. В языке программирования Java такие методы тоже есть и называются они рекурсивными.
На практике рекурсивно можно решать многие алгоритмические задачи. Наша — не исключение. Давайте выполним возведение в степень рекурсивно:
Как видно из реализации, существуют 2 момента:
- Условие выхода из рекурсии. Если возведенное значение степени достигает единицы, нас выбрасывает назад.
- Непосредственный механизм умножения value на результат вызова того же самого метода, однако с powValue — 1.
Для совсем ленивых разработчиков существуют способы «из коробки». Рассмотрим один из них.
BigInteger
BigInteger — это класс, который обеспечивает хранение целых чисел произвольной величины. Здесь существуют разные арифметические методы, которые позволяют работать с числами.
Выполняем возведение посредством BigInteger в Java:
Тут все предельно просто и не нуждается в дополнительных разъяснениях, не так ли? Однако на сегодня все, теперь вы будете знать о разных способах, позволяющих возводить в степень в «Джава».
По материалам: https://javarush.ru/groups/posts/2828-kak-vihpolnitjh-vozvedenie-v-stepenjh-v-java.
Интересуют более продвинутые знания по языку программирования Java? Добро пожаловать на курсы в Otus!