Введите с клавиатуры массив из 5 элементов, умножьте их на 2 и отобразите
Обновлено: 21.11.2024
Этот раздел содержит введение в создание матриц и выполнение основных вычислений матриц в MATLAB®.
В среде MATLAB термин матрица используется для обозначения переменной, содержащей действительные или комплексные числа, расположенные в двумерной сетке. массив — это, в более общем смысле, вектор, матрица или многомерная сетка чисел. Все массивы в MATLAB прямоугольные, в том смысле, что векторы компонентов по любому измерению имеют одинаковую длину. Математические операции, определенные над матрицами, являются предметом линейной алгебры.
Создание матриц
MATLAB имеет множество функций для создания различных типов матриц. Например, вы можете создать симметричную матрицу с элементами на основе треугольника Паскаля:
Или вы можете создать несимметричную матрицу магического квадрата с одинаковыми суммами строк и столбцов:
Другим примером является прямоугольная матрица случайных целых чисел 3 на 2. В этом случае первые входные данные randi описывают диапазон возможных значений целых чисел, а вторые два входных параметра описывают количество строк и столбцов.
Вектор-столбец — это матрица размером m на 1, вектор-строка — это матрица размером 1 на n, а скаляр — это матрица размером 1 на 1. 1 матрица. Чтобы задать матрицу вручную, используйте квадратные скобки [ ] для обозначения начала и конца массива. В скобках используйте точку с запятой ; для обозначения конца ряда. В случае скаляра (матрица 1 на 1) скобки не требуются. Например, эти операторы создают вектор-столбец, вектор-строку и скаляр:
Дополнительную информацию о создании матриц и работе с ними см. в разделе Создание, объединение и расширение матриц.
Сложение и вычитание матриц
Сложение и вычитание матриц и массивов выполняется поэлементно или поэлементно . Например, добавление A к B, а затем вычитание A из результата восстанавливает B:
Для сложения и вычитания обе матрицы должны иметь совместимые размеры. Если размеры несовместимы, возникает ошибка:
Векторные продукты и транспонирование
Вектор-строка и вектор-столбец одинаковой длины могут умножаться в любом порядке. Результатом является либо скаляр, называемый внутренним произведением, либо матрица, называемая внешним произведением:
Для вещественных матриц операция транспонировать меняет местами aij и акя. Для сложных матриц еще один вопрос заключается в том, следует ли брать комплексно-сопряженные элементы комплексного массива для формирования комплексно-сопряженного транспонирования . MATLAB использует оператор апострофа ( ' ) для выполнения комплексно-сопряженного транспонирования и оператор точка-апостроф ( .' ) для транспонирования без сопряжения. Для матриц, содержащих все действительные элементы, два оператора возвращают один и тот же результат.
Пример матрицы A = pascal(3) симметричен , поэтому A' равно A . Однако B = magic(3) несимметричен, поэтому B' имеет элементы, отраженные вдоль главной диагонали:
Для векторов транспозиция превращает вектор-строку в вектор-столбец (и наоборот):
Если x и y являются действительными векторами-столбцами, то произведение x*y не определено, но два произведения
выдает тот же скалярный результат. Эта величина используется так часто, что у нее есть три разных названия: внутренний продукт, скалярный продукт или точечный продукт. Существует даже специальная функция для точечных произведений с именем dot .
Для комплексного вектора или матрицы z величина z' не только транспонирует вектор или матрицу, но также преобразует каждый комплексный элемент в его комплексно-сопряженный. То есть меняется знак мнимой части каждого комплексного элемента. Например, рассмотрим комплексную матрицу
Комплексно-сопряженное транспонирование z:
Несопряженная комплексная транспонированная форма, в которой комплексная часть каждого элемента сохраняет свой знак, обозначается буквой z.' :
Для комплексных векторов два скалярных произведения x'*y и y'*x являются комплексно-сопряженными друг с другом, а скалярное произведение x'*x комплексного вектора на самого себя является действительным.
Матрицы умножения
Умножение матриц определяется таким образом, который отражает состав базовых линейных преобразований и позволяет компактно представлять системы одновременных линейных уравнений. Матричный продукт C = AB определяется, когда размерность столбца A равна размерности строки B. , или когда один из них является скаляром. Если A равно m-на-p, а B равно p-на- n, их произведение C равно m-на-n. На самом деле произведение можно определить с помощью MATLAB для циклов, записи с двоеточием и векторных скалярных произведений:
MATLAB использует звездочку для обозначения умножения матриц, как в C = A*B .Умножение матриц не является коммутативным; то есть A*B обычно не равно B*A :
Матрица может быть умножена справа на вектор-столбец и слева на вектор-строку:
Умножение прямоугольных матриц должно удовлетворять условиям совместимости размеров. Поскольку размер A равен 3 на 3, а размер C равен 3 на 2, вы можете умножить их, чтобы получить результат 3 на 2 (общий внутренний размер отменяется):
Однако умножение не работает в обратном порядке:
Вы можете умножать что угодно на скаляр:
Когда вы умножаете массив на скаляр, скаляр неявно расширяется до того же размера, что и другие входные данные. Это часто называют скалярным расширением .
Матрица идентичности
Общепринятые математические обозначения используют заглавную букву I для обозначения единичных матриц, матриц различных размеров с единицами на главной диагонали и нулями в других местах. Эти матрицы обладают тем свойством, что AI = A и IA = < em>A, если размеры совместимы.
Исходная версия MATLAB не могла использовать I для этой цели, потому что она не различала прописные и строчные буквы, а i уже служила нижним индексом и сложным Блок. Так был введен англоязычный каламбур. Функция
возвращает прямоугольную единичную матрицу m на n, а eye(n) возвращает n на n< /em> квадратная единичная матрица.
Матрица, обратная
Если матрица A квадратная и невырожденная (ненулевой определитель), то уравнения AX = I и X< /em>A = У меня есть такое же решение X. Это решение называется обратным к A и обозначается A -1 . Функция inv и выражение A^-1 вычисляют обратную матрицу.
Определитель, вычисляемый функцией det, является мерой коэффициента масштабирования линейного преобразования, описываемого матрицей. Когда определитель точно равен нулю, матрица сингулярна и не существует обратной.
Некоторые матрицы почти сингулярны , и, несмотря на то, что обратная матрица существует, расчет подвержен числовым ошибкам. Функция cond вычисляет номер условия для инверсии , что указывает на точность результатов инверсии матриц. Число обусловленности варьируется от 1 для численно стабильной матрицы до Inf для сингулярной матрицы.
Редко требуется формировать явную обратную матрицу. Часто неправильное использование inv возникает при решении системы линейных уравнений Ax = b . Лучший способ решить это уравнение с точки зрения как времени выполнения, так и численной точности — использовать матричный оператор обратной косой черты x = A\b . Дополнительную информацию см. в разделе mldivide.
Произведение тензора Кронекера
Произведение Кронекера kron(X,Y) двух матриц – это большая матрица, состоящая из всех возможных произведений элементов X на элементы Y . Если X равно m-на-n, а Y равно p-на-q, то kron(X, Y) равно mp-на-nq. Элементы расположены таким образом, что каждый элемент X умножается на всю матрицу Y :
Произведение Кронекера часто используется с матрицами из нулей и единиц для построения повторяющихся копий небольших матриц. Например, если X — матрица 2 на 2
и I = eye(2,2) — единичная матрица 2 на 2, тогда:
Помимо kron, для репликации массивов можно использовать и другие функции: repmat, repelem и blkdiag.
Векторные и матричные нормы
p-норма вектора x,
‖ Икс ‖ п знак равно ( ∑ | Икс я | п ) 1 п ,
вычисляется по норме(x,p) . Эта операция определена для любого значения p > 1, но наиболее распространенными значениями p являются 1, 2 и ∞. Значение по умолчанию: p = 2, что соответствует евклидовой длине или величине вектора:
p-норма матрицы A,
‖ A ‖ p = max x ‖ A x ‖ p ‖ x ‖ p ,
может быть вычислено для p = 1, 2 и ∞ по norm(A,p) . Опять же, значение по умолчанию равно p = 2:
В случаях, когда вы хотите вычислить норму каждой строки или столбца матрицы, вы можете использовать vecnorm :
Использование многопоточных вычислений с функциями линейной алгебры
MATLAB поддерживает многопоточные вычисления для ряда функций линейной алгебры и поэлементных числовых функций. Эти функции автоматически выполняются в нескольких потоках. Чтобы функция или выражение выполнялись быстрее на нескольких процессорах, должен выполняться ряд условий:
Эта функция выполняет операции, которые легко разбиваются на разделы, выполняемые одновременно. Эти разделы должны иметь возможность выполняться с небольшим взаимодействием между процессами. Они должны требовать нескольких последовательных операций.
Размер данных достаточно велик, поэтому любые преимущества параллельного выполнения перевешивают время, необходимое для разделения данных и управления отдельными потоками выполнения. Например, большинство функций ускоряются только тогда, когда массив содержит несколько тысяч элементов и более.
Эта операция не привязана к памяти; время обработки не зависит от времени доступа к памяти. Как правило, сложные функции ускоряют работу больше, чем простые.
Операторы умножения матрицы (X*Y) и степени матрицы (X^p) показывают значительное увеличение скорости на больших массивах двойной точности (порядка 10 000 элементов). Функции матричного анализа det , rcond , hess и expm также демонстрируют значительное увеличение скорости работы с большими массивами двойной точности.
Нам нужно иметь возможность считывать каждое входное значение дважды: один раз, чтобы вычислить среднее значение (кумулятивную сумму), и еще раз, чтобы подсчитать, сколько из них было выше среднего. Мы могли бы прочитать каждое значение в переменную, но мы не знаем, сколько дней потребуется для запуска программы, поэтому мы не знаем, сколько переменных нужно объявить.
Нам нужен способ объявить множество переменных за один шаг, а затем иметь возможность хранить их значения и обращаться к ним.
Задача: возможно ли решить вышеуказанную проблему, используя только методы из предыдущих заметок, без использования массивов? Как?
Массивы
массив — это объект, в котором хранится множество значений одного типа. Массив элемент — это одно значение в массиве. Массив index — это целое число, указывающее позицию в массиве. Как и String, массивы используют индексирование с отсчетом от нуля, то есть индексы массива начинаются с 0. Ниже показаны индексы и значения в массиве с 10 элементами типа < tt>целое.
индекс | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
value | 12 | 49 | -2 | 26 | 5 | 17 | -6 | 84 | 72 | 3 |
Объявление и создание массива
Это просто объявляет переменную, которая может содержать массив, но не создает сам массив.
Например, чтобы объявить переменную numbers, которая может содержать массив целых чисел, мы должны использовать:
Поскольку массивы являются объектами, мы создаем массивы с помощью new.
При создании массива вы указываете количество элементов в массиве следующим образом:
индекс | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
value | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Каждый элемент в массиве инициализируется нулем или любым значением, которое считается "эквивалентным" нулю для типа данных (false для boolean и null для String).
Сохранение значений и доступ к элементам
индекс | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
value | 27 | 0 | 0 | -6 | 0 | 0 | 0 | 0 | 0 | 0 |
При объявлении массива каждому элементу массива присваивается начальное значение по умолчанию.
Для целых чисел значение по умолчанию равно 0. Как вы думаете, какое значение по умолчанию используется для двойных чисел?
Упражнение: начальные значения массива по умолчанию
Напишите программу, которая объявляет массив double длины 4, печатает значения, присваивает значение каждому элементу и снова печатает значения.
Теперь сделайте то же самое для массива элементов String.
Массивы и циклы
Мы можем использовать целочисленную переменную в качестве индекса массива. Если мы используем цикл for для подсчета от 0 до самого высокого индекса, то мы можем обрабатывать каждый элемент массива. Например, следующий код суммирует элементы массива numbers.
Мы начинаем с 0, потому что индексы начинаются с 0. Мы заканчиваем сразу перед 10, потому что 10 — это длина нашего массива numbers, а последний индекс на единицу меньше длины массива.
[Массивы предоставляют много возможностей для ошибок один за другим из-за того, как работают индексы.]
Если бы мы изменили массив numbers, чтобы он содержал другое количество элементов, этот код больше не работал бы. К счастью, Java предоставляет простой способ получить длину массива, добавив .length после переменной массива, например:
Обратите внимание, что для массивов мы не используем круглые скобки после длины.
Это отличается от способа определения длины строк.
Упражнение: Инициализировать и показать целочисленный массив
Напишите программу, которая вводит длину массива int от пользователя и присваивает 1 по индексу 0, присваивает 2 по индексу 1, присваивает 3 по индексу 2 и так далее. Один цикл должен присваивать значения каждому элементу массива. Второй цикл должен печатать значения массива с пробелами между значениями.
Упражнение: Инициализировать и показать двойной массив
Напишите программу, которая вводит длину массива двойных от пользователя и значение для инициализации массива. Один цикл должен присвоить значение каждому элементу массива. Второй цикл должен печатать значения массива с пробелами между значениями.
Температурная программа
Рассмотрите взаимодействие в начале этих заметок. Вот псевдокод, который следует последовательности взаимодействий, используя массив для управления значениями, которые вводит пользователь. Обратите внимание, что мы не можем подсчитать, сколько элементов выше среднего, пока не вычислим среднее значение, и мы не можем вычислить среднее значение, пока не введем все элементы.
- Введите количество дней от пользователя.
- Объявите и создайте массив int с числом дней в качестве длины.
- Для каждого индекса в массиве:
- Введите температуру от пользователя.
- Сохранить температуру в массиве по этому индексу. ол>
- Добавьте значение этого индекса к сумме. ол>
- Если значение этого индекса больше среднего:
- Увеличить значение счетчика.
Мы могли бы объединить первые два цикла в один цикл, но чище делать их по отдельности.
Вот программа, соответствующая псевдокоду.Упражнение: дисперсия и стандартное отклонение
Измените программу температуры так, чтобы она также вычисляла дисперсию и стандартное отклонение температур.
Чтобы вычислить дисперсию, необходимо суммировать:Дополнительные функции массива
В Java есть множество других возможностей для программирования с массивами. Мы просто приводим здесь некоторые примеры и информацию. Дополнительную информацию см. в учебнике.
Если вы заранее знаете, какие значения будут в массиве, вы можете указать эти значения при объявлении массива, например:
Существует особый вид цикла (цикл for-each) для обработки каждого значения в массиве. Вот пример для программы «Температура». Конечно, лучше выбрать имя, чем foo.
Класс Arrays предоставляет несколько удобных статических методов для работы с массивами. Для их использования необходимо добавить Arrays. перед названием метода (и импортировать пакет java.util).
Имя метода Описание copyOf(array, newSize) возвращает копию массива с новым размером equals( array1, array2) возвращает true, если все элементы равны fill(массив, значение)< /td> присваивает каждому элементу массива значение sort(array) переставляет значения для перехода от наименьшего к наибольшему toString(array) возвращает String представление массив Задание: массив простых чисел
Напишите программу для инициализации массива первыми 10 простыми числами: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29.
Используйте цикл for-each для суммирования значений в массиве.
Выведите массив с помощью метода Arrays.toString.Массивы и методы
Как и другие типы, массивы можно передавать в качестве параметров методам. Предположим, нам нужен метод для суммирования значений в массиве double. Это потребует передачи массива в качестве параметра и возврата результата double.
В данном случае имя параметра — vals, но, как и для всех переменных параметров, вы можете выбрать любое имя по своему усмотрению. Обратите внимание, что [ ] является частью типа параметра. double[ ] vals следует читать как "двойной массив с именем vals".
Упражнение: Метод усреднения массива
Напишите метод, который возвращает среднее значение в массиве int. Включите и используйте этот метод в программе Температура.Массивы также могут быть возвращены методом. Предположим, нам нужен метод, который преобразует String в массив char. Это потребует передачи String в качестве параметра и возврата массива char.
Обратите внимание, что [ ] является частью типа возвращаемого значения, а токен является именем параметра String. Внутри метода нам нужно убедиться, что массив имеет ту же длину, что и String; код получает это значение с помощью метода length. Обратите внимание, что метод length используется дважды: один раз, чтобы указать длину нового массива, а другой — в проверке цикла.
Упражнение: Создайте метод массива int
Напишите метод, который возвращает новый массив int заданного размера и с инициализацией каждого элемента заданным значением. Обратите внимание, что этот метод требует два параметра. Включите и используйте этот метод в программе Температура.Ссылки
Когда вы передаете массив в качестве параметра, Java не создает новую копию массива. Это было бы очень неэффективно для больших массивов. Вместо этого переменная параметра хранит ссылку (или указатель) на тот же массив. Это означает, что если метод изменяет массив, то эти изменения будут видны коду, вызывающему метод. Рассмотрим следующую программу.
Вывод этой программы:
Обратите внимание, что метод setToZero не изменяет value1 на ноль. Когда параметр является примитивным типом, значение копируется. Это иллюстрирует ситуацию до и после оператора value2 = 0;. Значения для value1 и value2 хранятся в двух разных местах.До После value1 3.14 value1 tt> 3.14 value2 3.14 value2 0.0
Однако метод set2Zero изменил элемент array1 на ноль. Когда параметр является массивом, копируется ссылка, а не массив. Это иллюстрирует ситуацию до и после оператора array2[index] = 0;. И массив1, и массив2 ссылаются на один и тот же массив.- Сколько переменных целочисленного массива есть в этой программе?
- Сколько объектов целочисленного массива есть в этой программе?
- Что печатает эта программа?
- После вывода первой строки к скольким массивам может получить доступ эта программа?
- После того, как будет напечатана последняя строка, к скольким массивам может получить доступ эта программа?
- Допустим, мы добавим строку: в конце программы. Сколько массивов теперь может получить доступ к этой программе?
- Напишите метод doubleDoubleArray, который удваивает каждый элемент в массиве double.
Этот метод должен иметь параметр массива и возвращаемый тип void.
Напишите программу для проверки метода, печатающую массив до и после вызова метода. - Напишите аналогичный метод doubleIntArray, который удваивает каждый элемент в массиве int.
- Можете ли вы написать единственный метод, который может принимать массив double или массив int в качестве параметра и удваивать элементы массива?
Алгоритмы обхода массива
Дополнительная тема: Чтение файла в массив
Если вы выполняли некоторые действия, вы, вероятно, обнаружили, что вводить значения для массивов вручную утомительно. Программе было бы удобнее читать значения из файла. Дополнительную информацию об обработке файлов можно найти в главе 6 учебника.
файл — это набор информации, который хранится на компьютере и которому присвоено имя. Например, hamlet.txt может быть именем файла, содержащего текст Hamlet. Hello.java может быть именем файла с вашей программой "Hello World". Мы будем работать с текстовыми файлами, включая файлы с расширением .txt, а также файлы .java и .html. р>
- Открыть файл для чтения (или записи).
- Чтение данных из файла (или запись данных в файл).
- Закройте файл.
В Java мы будем использовать объекты File для представления файлов и объекты Scanner для открытия, чтения и закрытия файлов. Предположим, у нас есть файл temperature.txt, который содержит следующую информацию, необходимую программе Temperature.
Предполагая, что этот файл находится в той же папке, что и программа Temperature, объект File может быть создан с помощью этого оператора.
Для большинства целей нам не нужен объект File, за исключением создания объекта Scanner, поэтому два приведенных выше оператора можно закодировать в один оператор.
Мы можем использовать объект Scanner для файла так же, как объект Scanner для клавиатуры, за исключением того, что нам не нужно печатать подсказки. Вот программа Temperature, которая считывает информацию из файла.
Обратите внимание, что необходим дополнительный оператор импорта; это потому, что класс File является частью пакета java.io. Также обратите внимание, что в заголовке метода необходимо предложение throws. Это связано с тем, что Java требует, чтобы вы обращали внимание на возможность FileNotFoundException. Было бы лучше использовать оператор try/catch для решения этой проблемы, но это выходит за рамки данного курса.- Измените файл, чтобы он содержал недопустимые данные. Что происходит?
- Измените программу так, чтобы она считывала температуры из файла, пока есть допустимые записи для чтения, а затем отображала результаты.
- Измените программу, чтобы она печатала температуры по мере их считывания.
- Удалите первую строку (количество дней) из файла Temperature.txt.
- Замените первый цикл for на:
while(input.hasNextInt()) - Создайте массив размером MAX_SIZE, константой, инициализированной до 100.
- Сохраняйте подсчет количества прочитанных значений (переменная count уже занята).
Используйте его как индекс для хранения элементов в массиве и для вычисления среднего значения. Не используйте temps.length - Распечатайте количество считанных значений температуры вместе со средней температурой.
- Измените цикл while, чтобы не считывалось больше MAX_SIZE чисел.
Задание: Поиск Гамлета
Напишите программу, которая считывает 32230 токенов из hamlet.txt в массив String. Запросить у пользователя слово для поиска. Подсчитайте и распечатайте, сколько раз встречается это слово. Вы можете попробовать два слова: "haue" (более 100 раз) и "againe" (более 10 раз).Дополнительная тема: многомерные массивы
Во многих приложениях данные имеют несколько измерений. Таблицы, изображения. и видео являются тремя распространенными примерами. Здесь мы будем использовать пример файла iris.txt. Если вы хотите узнать больше о том, что означают эти числа, вы можете прочитать это.
Первая строка iris.txt указывает, что данные состоят из 150 строк (или строк) и 5 столбцов. Многомерный массив может быть объявлен так, чтобы мы могли получить доступ к элементу по строке и столбцу. Предполагая, что эти числа хранятся в переменных с именами rows и columns, мы можем объявить двумерный массив следующим образом:
Обратите внимание, что в объявлении есть две пары квадратных скобок. Также обратите внимание, что указаны две длины. Для трехмерного массива нам потребуются три пары скобок и так далее для более высоких измерений.
Элемент в десятой строке и третьем столбце будет назначен и доступен:
Для обоих параметров используется индексация с отсчетом от нуля. Конечно, было бы очень утомительно писать 750 строк кода для присвоения значения каждому элементу массива iris. Обычно используются вложенные циклы.
- Для каждого индекса строки:
- Для индекса каждого столбца:
- Что-то делать с элементом в этой строке и столбце
Если объект Scanner для чтения из iris.txt хранится в переменной input, то следующий код заполнит массив (при условии, что первые два числа были потреблены).
Подобный двойной цикл может быть закодирован для другой обработки данных. Предположим, вы хотите вычислить среднее значение каждого из столбцов. Для пяти столбцов можно объявить пять переменных, но для пяти средних лучше объявить массив с пятью элементами. В следующем коде дополнительный массив сначала используется для хранения сумм по каждому столбцу, а затем деление приводит к среднему значению.
Когда у вас много данных, часто полезно посмотреть, как они выглядят. В качестве последнего примера рассмотрим, как подсчитать, сколько раз каждое значение встречается в файле iris.txt. При проверке каждое значение имеет не более одного десятичного знака, поэтому, если мы умножим на 10 и округлим, то разные значения будут соответствовать разным целым числам. Все значения в файле iris.txt положительные, а наибольшее значение равно 7,9, поэтому целые числа будут находиться в диапазоне от 1 до 79. Это означает, что для подсчета каждого значения можно использовать массив целых чисел длиной 80.
Например, предположим, что значение равно 2,3. Умножение на 10 дает 23. Это означает, что мы должны добавить 1 к целочисленному массиву с индексом 23. Вот код, который подсчитывает все 750 значений.
В этом разделе мы рассмотрим фундаментальную конструкцию, известную как массив. Массив хранит последовательность значений одного типа. Мы хотим не только хранить значения, но и иметь возможность быстрого доступа к каждому отдельному значению. Метод, который мы используем для обращения к отдельным значениям в массиве, состоит в том, чтобы пронумеровать, а затем индексировать их. Если у нас есть n значений, мы думаем, что они пронумерованы от 0 до n−1.
Массивы в Java.
- Объявите имя массива.
- Создайте массив.
- Инициализировать значения массива.
Типичный код обработки массива.
ArrayExamples.java содержит типичные примеры использования массивов в Java.
Программирование с массивами.
- Индексирование с отсчетом от нуля. Мы всегда ссылаемся на первый элемент массива a[] как a[0], на второй как a[1] и так далее. Вам может показаться более естественным обращаться к первому элементу как к a[1], ко второму значению как a[2] и т. д., но запуск индексации с 0 имеет некоторые преимущества и является соглашением, используемым в большинстве современных языков программирования.
- Длина массива. Когда мы создаем массив, его длина фиксируется. Вы можете ссылаться на длину a[] в своей программе с помощью кода a.length.
- Инициализация массива по умолчанию. Для экономии кода мы часто пользуемся соглашением Java об инициализации массива по умолчанию. Например, следующий оператор эквивалентен четырем строкам кода в верхней части этой страницы:
После создания двух массивов мы можем использовать их для вывода случайного имени карты, например Королева треф, следующим образом.
Перетасовка и выборка.
- Обмен. Часто нам нужно обменять два значения в массиве. Продолжая наш пример с игральными картами, следующий код меняет местами карту в позиции i и карту в позиции j:
Предварительно вычисленные значения.
Одним из простых применений массивов является сохранение вычисленных значений для последующего использования. В качестве примера предположим, что вы пишете программу, которая выполняет вычисления, используя малые значения гармонических чисел. Один из простых способов выполнить такую задачу — сохранить значения в массиве с помощью следующего кода
а затем просто используйте код harmonic[i] для ссылки на любое из значений. Предварительное вычисление значений таким образом в примере компромисса между пространством и временем: инвестируя в пространство (для сохранения значений), мы экономим время (поскольку нам не нужно их пересчитывать). Этот метод неэффективен, если нам нужны значения для огромного n, но очень эффективен, если нам нужно огромное количество значений для малого n.
Упрощение повторяющегося кода.
В качестве примера другого простого применения массивов рассмотрим следующий фрагмент кода, который печатает название месяца по его номеру (1 – январь, 2 – февраль и т. д.):
Мы также могли бы использовать оператор switch, но гораздо более компактной альтернативой является использование массива строк, состоящего из названий каждого месяца:
Этот метод был бы особенно полезен, если бы вам нужно было получить доступ к названию месяца по его номеру в нескольких разных местах вашей программы. Обратите внимание, что мы намеренно теряем один слот в массиве (элемент 0), чтобы MONTHS[1] соответствовали январю, как это требуется.
Сборщик купонов.
Предположим, что у вас есть перетасованная колода карт, и вы переворачиваете их лицевой стороной вверх одну за другой. Сколько карт вам нужно открыть, прежде чем вы увидите по одной каждой масти? Это пример известной задачи сборщика купонов. В общем, предположим, что компания, выпускающая коллекционные карточки, выпускает коллекционные карточки с n различными возможными карточками: сколько вам нужно собрать, прежде чем вы получите все n возможностей, предполагая, что каждая возможность равновероятно для каждой карты, которую вы собираете? CouponCollector.java принимает целочисленный аргумент командной строки n и моделирует этот процесс. Подробнее см. в учебнике.
Решето Эратосфена.
Функция подсчета простых чисел π(n) – это количество простых чисел, меньших или равных n. Например, π(17) = 7, так как первые семь простых чисел равны 2, 3, 5, 7, 11, 13 и 17. PrimeSieve.java принимает целочисленный аргумент командной строки n и вычисляет π (n) с помощью Решета Эратосфена. Подробности смотрите в учебнике.
Двумерные массивы.
Мы называем такой массив массивом размером m на n. По соглашению первое измерение — это количество строк, а второе — количество столбцов.
Описывает операторы, выполняющие арифметические действия в PowerShell.
Подробное описание
Арифметические операторы вычисляют числовые значения. Вы можете использовать один или несколько арифметических операторов для сложения, вычитания, умножения и деления значений, а также для вычисления остатка (модуля) операции деления.
Кроме того, оператор сложения ( + ) и оператор умножения ( * ) также работают со строками, массивами и хэш-таблицами. Оператор сложения объединяет ввод. Оператор умножения возвращает несколько копий ввода. Вы даже можете смешивать типы объектов в арифметическом операторе. Метод, используемый для оценки оператора, определяется типом самого левого объекта в выражении.
Начиная с PowerShell 2.0 все арифметические операторы работают с 64-битными числами.
Начиная с PowerShell 3.0, для поддержки побитовой арифметики в PowerShell добавляются -shr (сдвиг вправо) и -shl (сдвиг влево).
PowerShell поддерживает следующие арифметические операторы:
Оператор Описание Пример + Складывает целые числа; объединяет 6 + 2 строки, массивы и хеш-таблицы. "файл" + "имя" @(1, "один") + @(2.0, "два") @ + @ + Создает число из объекта + 123 - Вычитает одно значение из другого 6 - 2 value - Вычисляет противоположное число --6 (Get-Date).AddDays(-1) * Умножение чисел или копирование строк 6 * 2 и массивы указанных чисел td> @("!") * 4 раз. "!" * 3 / Делит два значения. 6 / 2 < td>% Modulus — возвращает остаток от 7 % 2 операции деления. tr>-band Побитовое И 5-band 3 -bnot Побитовое НЕ -bnot 5 -bor Побитовое ИЛИ 5 -bor 0x03 -bxor Побитовое XOR 5 -bxor 3 -shl Сдвигает биты влево 102 -shl 2 -shr Сдвигает биты вправо 102 -shr 2 Побитовые операторы работают только с целочисленными типами.
Приоритет оператора
PowerShell обрабатывает арифметические операторы в следующем порядке:
Приоритет Оператор Описание 1 () Скобки 2 - Для отрицательное число или унарный оператор 3 * , / , % Для умножения и деления 4 + , - Для сложения и вычитания 5 -band , -bnot Для побитовых операций 5 -bor , -bxor Для побитовых операций тело> таблица>5 -shr , -shl Для побитовых операций PowerShell обрабатывает выражения слева направо в соответствии с правилами приоритета. В следующих примерах показано действие правил приоритета:
Выражение Результат 3+6/3*4< /td> 11 3+6/(3*4) 3.5 < td>(3+6)/3*4 12 Порядок, в котором PowerShell оценивает выражения, может отличаться от других используемых вами языков программирования и сценариев. В следующем примере показан сложный оператор присваивания.
В этом примере выражение $a++ вычисляется перед $b[$a] . Вычисление $a++ изменяет значение $a после его использования в операторе $c[$a++] ; но до того, как он будет использован в $b[$a] . Переменная $a в $b[$a] равна 1, а не 0; поэтому оператор присваивает значение $b[1] , а не $b[0] .
Приведенный выше код эквивалентен:
Деление и округление
Если частное операции деления является целым числом, PowerShell округляет это значение до ближайшего целого числа. Если значение равно .5 , оно округляется до ближайшего четного целого числа.
В следующем примере показан результат округления до ближайшего четного целого числа.
Выражение Результат [int]( 5 / 2 ) 2 [int]( 7 / 2 ) 4 Обратите внимание, как 5/2 = 2,5 округляется до 2. Но 7/2 = 3,5 округляется до 4.
Вы можете использовать класс [Math], чтобы получить другое поведение округления.
Выражение Результат [int][Math]:: Round(5/2,[MidpointRounding]::AwayFromZero) 3 [int][Math]::Ceiling(5/2)< /td> 3 [int][Math]::Floor(5 / 2) 2 Для получения дополнительной информации см. метод Math.Round.
Сложение и умножение нечисловых типов
Вы можете добавлять числа, строки, массивы и хеш-таблицы. И вы можете умножать числа, строки и массивы. Однако вы не можете умножать хэш-таблицы.
При добавлении строк, массивов или хэш-таблиц элементы объединяются. При объединении коллекций, таких как массивы или хеш-таблицы, создается новый объект, содержащий объекты из обеих коллекций. Если вы попытаетесь объединить хеш-таблицы с одинаковым ключом, операция завершится ошибкой.
Например, следующие команды создают два массива, а затем добавляют их:
Следующие примеры демонстрируют использование операторов сложения и умножения; в операциях, которые включают различные типы объектов. Предположим, что $array = 1,2,3 , $red = [ConsoleColor]::Red , $blue = [ConsoleColor]::Blue :
Выражение Результат "файл" + 16 file16 $array + 16 1 , 2 , 3 , 16 $array + "file" 1 , 2 , 3 , файл $array * 2 1 , 2 , 3 , 1 , 2 , 3 "файл" * 3 файлфайлфайл $blue + 3 Красный $red - 3 Синий $blue - $red -3 + '123' 123 Поскольку метод, используемый для оценки операторов, определяется крайним левым объектом, сложение и умножение в PowerShell не являются строго коммутативными. Например, (a + b) не всегда равно (b + a) и (ab) не всегда равно (ba).
Следующие примеры демонстрируют этот принцип:
Выражение Результат "файл" + 16 file16 16 + "file" Невозможно преобразовать значение "file" в тип "System.Int32". < /tr>Ошибка: «Входная строка имеет неверный формат». В строке:1 символ:1 ˙+ 16 + "файл"` Хеш-таблицы — это немного другой случай. Вы можете добавлять хеш-таблицы в другую хеш-таблицу, если в добавленных хеш-таблицах нет повторяющихся ключей.
В следующем примере показано, как добавлять хеш-таблицы друг к другу.
В следующем примере возникает ошибка, поскольку один из ключей дублируется в обеих хеш-таблицах.
Кроме того, в массив можно добавить хеш-таблицу; и вся хэш-таблица становится элементом массива.
Однако в хеш-таблицу нельзя добавить какой-либо другой тип.
Хотя операторы сложения очень полезны, используйте операторы присваивания для добавления элементов в хэш-таблицы и массивы. Дополнительные сведения см. в разделе about_assignment_operators. В следующих примерах оператор присваивания += используется для добавления элементов в массив:
Преобразование типа для размещения результата
Если результат операции слишком велик для данного типа, тип результата расширяется, чтобы вместить результат, как в следующем примере:
Тип результата не обязательно будет таким же, как у одного из операндов. В следующем примере отрицательное значение не может быть преобразовано в целое число без знака, а целое число без знака слишком велико для преобразования в Int32 :
В этом примере Int64 поддерживает оба типа.
Тип System.Decimal является исключением. Если любой из операндов имеет тип Decimal, результат будет иметь тип Decimal. Если результат слишком велик для типа Decimal, он не будет преобразован в Double. Вместо этого возникает ошибка.
Выражение Результат [Decimal]::maxvalue td> 79228162514264337593543950335 [Decimal]::maxvalue + 1 Значение было слишком большим или слишком маленьким для < /tr>Десятичный. Арифметические операторы и переменные
Вы также можете использовать арифметические операторы с переменными. Операторы действуют на значения переменных. Следующие примеры демонстрируют использование арифметических операторов с переменными:
Выражение Результат $intA = 6
$intB = 4
$intA + $intB10 $a = "Power"
$b = "Shell "
$a + $bPowerShell Арифметические операторы и команды
Обычно арифметические операторы используются в выражениях с числами, строками и массивами.Однако вы также можете использовать арифметические операторы с объектами, возвращаемыми командами, и со свойствами этих объектов.
В следующих примерах показано, как использовать арифметические операторы в выражениях с командами PowerShell:
Оператор скобок принудительно выполняет оценку командлета Get-Date и оценку выражения командлета New-TimeSpan -Day 1 в указанном порядке. Затем оба результата добавляются с помощью оператора +.
В приведенном выше выражении каждое рабочее пространство процесса ( $_.ws ) умножается на 2; и результат сравнивается с 50 МБ, чтобы увидеть, больше ли он.
Побитовые операторы
PowerShell поддерживает стандартные побитовые операторы, включая побитовое И ( -bAnd ), включающие и исключающие побитовые операторы ИЛИ ( -bOr и -bXor ) и побитовое НЕ ( -bNot ).
Начиная с PowerShell 2.0 все побитовые операторы работают с 64-битными целыми числами.
Начиная с PowerShell 3.0 для поддержки побитовой арифметики в PowerShell введены -shr (сдвиг вправо) и -shl (сдвиг влево).
PowerShell поддерживает следующие побитовые операторы.
< tbody>Оператор Описание Выражение Результат -band Побитовое И 10-band 3 2 < td>-bor Побитовое ИЛИ (включительно) 10 -bor 3 11 - bxor Побитовое ИЛИ (исключающее) 10 -bxor 3 9 -bnot td> Побитовое НЕ -bNot 10 -11 -shl Shift -влево 102 -шл 2 408 -shr Shift-вправо 102 -shr 1 51 Побитовые операторы действуют на двоичный формат значения. Например, битовая структура числа 10 — 00001010 (на основе 1 байта), а битовая структура числа 3 — 00000011. Когда вы используете побитовый оператор для сравнения 10 с 3, сравниваются отдельные биты в каждом байте. .
В операции побитового И результирующий бит устанавливается в 1, только если оба входных бита равны 1.
В операции побитового ИЛИ (включительно) результирующий бит устанавливается в 1, когда один или оба входных бита равны 1. Результирующий бит устанавливается в 0, только если оба входных бита установлены в 0.
В операции побитового ИЛИ (исключающее) результирующий бит устанавливается в 1, только если один входной бит равен 1.
Побитовый оператор НЕ — это унарный оператор, который производит двоичное дополнение значения. Биту 1 присваивается значение 0, а биту 0 присваивается значение 1.
Например, двоичное дополнение 0 равно -1, максимальное целое число без знака (0xffffffff), а двоичное дополнение -1 равно 0.
В операции побитового сдвига влево все биты перемещаются на "n" позиций влево, где "n" — значение правого операнда. Вместо единиц вставляется ноль.
Когда левый операнд представляет собой целое (32-разрядное) значение, младшие 5 бит правого операнда определяют, на сколько битов левого операнда сдвигается.
Если левый операнд представляет собой длинное (64-битное) значение, младшие 6 бит правого операнда определяют, на сколько битов левого операнда сдвигается.
Выражение Результат Двоичный результат 21 -шл 0 21 0001 0101 21 -шл 1 42 тд> <тд>0010 1010тд> тр> <тр> <тд>21 -шл 2тд> <тд>84тд> <тд>0101 0100тд> тр> В операции побитового сдвига вправо все биты перемещаются на "n" позиций вправо, где "n" задается правым операндом. Оператор сдвига вправо (-shr) вставляет ноль в крайнее левое место при сдвиге вправо положительного или беззнакового значения.
Когда левый операнд представляет собой целое (32-разрядное) значение, младшие 5 бит правого операнда определяют, на сколько битов левого операнда сдвигается.
Если левый операнд представляет собой длинное (64-битное) значение, младшие 6 бит правого операнда определяют, на сколько битов левого операнда сдвигается.
Читайте также:
- Почему у меня черный экран
- Отслеживание обзора aoc 22v2q
- Как играть в фортнайт на клавиатуре
- Как откатить драйвер мыши
- Лучшие механические клавиатуры 2021 года
- Для индекса каждого столбца: