matlab — вопросы с ответами

MATLAB – это мощная техническая вычислительная система для обработки научных и инженерных расчетов. Название MATLAB расшифровывается как Matrix Laboratory, потому что система была разработана, чтобы сделать вычисления матриц как можно более простыми. Матрица – это массив чисел, организованных в m строк и n столбцов. Наглядным примером является следующий массив m × n = 2 × 3:

Любой из элементов в матрице может быть извлечен с помощью индексов строк и столбцов, которые определяют его местоположение. Элементы в этом примере выделены следующим образом: A (1,1) = 1, A (1,2) = 3, A (1,3) = 5, A (2,1) = 2, A (2,2) = 4, A (2,3) = 6. Первый индекс определяет номер строки, отсчитываемый сверху вниз; второй индекс – это номер столбца, отсчитываемый слева направо. Это общепринятое соглашение, используемое в MATLAB для поиска информации в массиве. Компьютер полезен тем, что он может быстро выполнять многочисленные вычисления, поэтому работа с большими числовыми наборами данных, перечисленными в таблицах как массивы или матрицы строк и столбцов, довольно эффективна.

Одна из многих вещей, которые нравится многим инженерам в MATLAB (и это отличает ее от многих других систем компьютерного программирования, таких как C++ и Java), заключается в том, что вы можете использовать его в интерактивном режиме. Это означает, что вы вводите некоторые команды в специальном приглашении ввода MATLAB и сразу получаете результаты. Решаемые таким образом задачи могут быть очень простыми, например, найти квадратный корень, или очень сложными, например, найти решение системы дифференциальных уравнений. Для решения многих технических проблем вы вводите только одну или две команды – MATLAB выполняет большую часть работы за вас.

Есть три основных требования для успешных приложений MATLAB:

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

Рабочая среда

Есть два способа работы в MATLAB. Первый способ – работать в командной строке, записывая по одной команде за раз. Второй способ – написать скрипт (файл .m, имеющий последовательный набор команд) и запустить его из командной строки, просто набрав его имя. Например, чтобы запустить файл сценария a.m, вы просто пишете в командной строке следующее:

1 >>a

По умолчанию командная строка обозначается символом >>. Вы вводите команду в командной строке и затем нажимаете клавишу Enter, чтобы выполнить ее.

Принцип REPL

Командная строка MATLAB работает по принципу REPL, что означает Read-Evaluates-Prints-Loop. Когда что-то вводится в командную строку MATLAB, язык Julia:

  1. Читает, что пользователь вводит.
  2. Оценивает, что читает.
  3. Распечатывает возвращаемое значение после оценки.
  4. Зацикливается и делает все заново.

Все команды MATLAB обрабатываются как выражения для оценки в REPL. Многие среды программирования, такие как интерактивная оболочка Python, а также формат ноутбука Jupyter, используют один и тот же подход. Новый язык под названием Julia также имеет REPL и работает аналогичным образом.

Типы данных

При назначении данных переменной важно понимать, что данные могут быть определены как различные объекты, определенные их типами данных, следующим образом:

  • logical: этот тип данных хранит логические значения 1 или 0, которые могут работать с логическими операторами, такими как AND, OR, XOR и другими;
  • char: этот тип данных хранит буквенные символы и строки (группы символов, записанные в последовательности);
  • int8, int16, int32 и int64: данные этого типа хранятся в виде целых чисел в 8, 10, 32 и 64 бита соответственно. Размер целого числа определяется количеством битов;
  • uint8, uint16, uint32 и uint64: этот тип данных хранит целочисленные данные без знака в 8, 16, 32 и 64 битах соответственно;
  • double и single: данные этого типа хранятся как плавающие типы двойной и одинарной точности соответственно. Десятичные числа представлены типами данных с плавающей запятой. Данные с одинарной точностью занимают 4 байта (32 бита), а с двойной точностью – 8 байтов (64 бита) для хранения чисел с плавающей запятой;
  • double complex and single complex: комплексные числа имеют действительные и мнимые части, которые хранятся отдельно. Эти числа могут быть сохранены как числа одинарной или двойной точности с использованием этих типов данных.

В системе с одинарной точностью 23 бита хранят биты дроби (то есть числа после десятичной запятой), 8 бит запоминают показатель степени (то есть числа перед десятичной запятой), а 32-й бит резервируется для хранения знака.

В системе с двойной точностью 52 бита хранят биты дроби (то есть числа после десятичной запятой), 11 бит запоминают показатель степени (то есть числа перед десятичной запятой), а 64-й бит зарезервирован для хранения знака.

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

Переменные

Для временного хранения значений мы используем переменные, которые хранят значение в определенной ячейке памяти и адресуют его с помощью символа или набора символов (называемых строками). Например, вы можете сохранить значение 1/10 * pi в качестве переменной a, а затем использовать его в уравнении, подобном следующему:

Чтобы сделать этот расчет:

Нужно выполнить:

Следовательно, символ = работает как оператор присваивания. Он присваивает значение справа переменной, названной слева. Многократные назначения могут быть выполнены с помощью оператора запятой (,). Кроме того, если вы не хотите выводить результаты на экран, вы можете отключить это, используя оператор (;).

Соглашения о названиях переменных

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

  • Имена не должны начинаться с цифры; тем не менее, числа могут быть использованы в любом месте после этого;
  • Имена переменных чувствительны к регистру;
  • Ключевые слова не могут быть использованы в качестве имен;
  • Имена могут включать подчеркивание (_).

При именовании переменной, если вам нужно проверить, что данное имя является ключевым словом, вы можете использовать встроенную функцию iskeyword(name). Простой ввод iskeyword() создает список ключевых слов, как показано здесь:

Список переменных

Во время работы над проектом полезно отслеживать все переменные, используемые в проекте, чтобы избежать ошибок из-за дублирования имен. Вы можете получить список всех переменных с помощью команд who и whos. В то время как команда who просто представляет список переменных в рабочей области, whos приводит ее с дополнительной информацией, такой как размер переменной, количество байтов, используемых для хранения переменной, и тип переменной.

Обратите внимание, что список переменных, созданных в этом примере, представляет текущее состояние компьютера. Используя who и whos, вы можете отслеживать требования к памяти. Помните, что разумное использование ресурсов памяти важно, особенно в системах на основе Raspberry Pi. Чтобы стереть сохраненные переменные, вы можете использовать команду очистки. Также важно отметить, что список переменных зависит от сеанса. Когда вы выходите из сеанса, закрывая MATLAB с помощью значка или с помощью exit, список переменных стирается из памяти.

Глобальные и локальные переменные

Переменная, объявленная глобально (то есть внутри основной программы), называется глобальной переменной, тогда как переменная, объявленная локально в функции, называется локальной переменной. Чтобы определить глобальную переменную, вы используете оператор global. После определения он остается неизменным независимо от любого нового определения, если только вы не введете команду очистки для удаления имен и значений переменных из памяти.

Как уже было видно, a = 1 остается неизменным независимо от следующего определения, a = 2. Когда в командной строке выдается команда clear, все имена и значения переменных удаляются из памяти, и имя переменной можно использовать снова. На этот раз, если она не определена как глобальная переменная, ее значение можно изменить несколько раз. Команда isglobal() позволяет проверить, определено ли имя переменной как глобальная переменная.

Глобальные переменные используются для определения констант во время численных расчетов. Предположим, вы хотите, чтобы определенные переменные меняли значения, поэтому вы можете сделать эти неизменные значения глобальными переменными, указав имя по вашему выбору. Предопределенные переменные, такие как pi, e и т. д., определяются аналогичным образом.

Векторы

Переменные, такие как >> a = 2 <Enter> и >> b = 3; <Enter>, называются скалярами; они однозначные. MATLAB также обрабатывает векторы (обычно называемые массивами), которые являются ключом ко многим его мощным функциям. Самый простой способ определения вектора, в котором элементы (компоненты) увеличиваются на одинаковую величину, – это утверждение типа:

>> x = 0 : 10; <Enter>

Это двоеточие (:) между 0 и 10. Нет необходимости оставлять пробел по обе стороны от него, за исключением того, чтобы сделать его более читабельным. Введите x, чтобы проверить, что x является вектором; это вектор строки, состоящий из 1 строки и 11 столбцов. Введите следующую команду, чтобы убедиться, что это так:

>> size(x) <Enter>

Часть реальной мощи MATLAB наглядно иллюстрируется тем фактом, что другие векторы теперь могут быть определены (или созданы) в терминах только что определенного вектора x. Попробуйте ввести следующее

>> y = 2 .* x <Enter>

>> w = y ./ x <Enter>

и

>> y = sin(x) <Enter>

(без точек с запятой). Обратите внимание, что первая командная строка создает вектор y путем умножения каждого элемента x на коэффициент 2. Вторая командная строка является операцией массива, которая создает вектор w, беря каждый элемент y и деля его на соответствующий элемент x. Поскольку каждый элемент y в два раза больше соответствующего элемента x, вектор w является вектором-строкой из 11 элементов, все из которых равны 2. Наконец, z – это вектор с sin(x) в качестве его элементов.

9 ответов
i и j - очень популярные имена переменных (см., например, этот вопрос и этот). Например, в циклах: for i=1:10, % do something... end Как индексы в матрицу: mat( i, j ) = 4; Почему они не должны использоваться как имена переменных в Matlab?
naming-conventions
variables
09 фев. 2013, в 17:41
7 ответов
В VBA я могу сделать следующее: A = B + IIF(C>0, C, 0) так что если C > 0, то получим A=B+C и C <= 0 получаем A=B Есть ли оператор или функция, которые позволят мне выполнять эти условные обозначения inline в коде MATLAB?
ternary-operator
iif
conditional-operator
30 янв. 2013, в 20:33
8 ответов
Каков наилучший способ представления и решения лабиринта с учетом изображения? [IMG_OUR_ID=522.jpg] Учитывая изображение в формате JPEG (как показано выше), какой лучший способ его прочитать, проанализировать его в некоторой структуре данных и решить лабиринт? Мой первый инстинкт - прочитать изобра...
image-processing
algorithm
maze
21 окт. 2012, в 06:37
5 ответов
Мой вопрос: Я заметил, что много хороших ответов на вопросы Matlab на SO часто используют функцию bsxfun. Почему? Мотивация: В документации Matlab для bsxfun приведен следующий пример: A = magic(5); A = bsxfun(@minus, A, mean(A)) Конечно, мы могли бы выполнить ту же операцию, используя: A = A -...
arrays
bsxfun
18 окт. 2012, в 10:12
4 ответа
[IMG_OUR_ID=523.png] Итак, талантливые люди выяснили, как сделать xkcd графы стиля в Mathematica, в LaTeX, в Python и в R уже. Как можно использовать MATLAB для создания графика, который выглядит как выше? Что я пробовал Я создал вигглые линии, но я не мог получить остроконечные топоры. Единственн...
plot
03 окт. 2012, в 03:22
9 ответов
Я программист, который знает Python, Ruby и некоторые C, которые пытаются решить, следует ли изучать GNU Octave или Matlab. Я знаю, что у них много вообще, но мне непонятно, насколько похожи синтаксис или даже структуры данных. Все говорят, что они "похожи", но никто не говорит, насколько они похожи...
octave
23 авг. 2012, в 03:26
15 ответов
Я делаю некоторые тесты с CUDA, C++, С# и Java, и использую MATLAB для проверки и генерации матрицы. Но когда я умножаю с помощью MATLAB, матрицы 2048x2048 и даже больше умножаются практически мгновенно. 1024x1024 2048x2048 4096x4096 --------- --------- --------- C...
performance
cuda
matrix-multiplication
19 май 2011, в 11:03
9 ответов
Например, если я хочу прочитать среднее значение из magic(5), я могу сделать это следующим образом: M = magic(5); value = M(3,3); чтобы получить value == 13. Я хотел бы сделать что-то вроде этого: value = magic(5)(3,3); value = (magic(5))(3,3); отказаться от промежуточной переменной. Однако MATLA...
indexing
matrix
return-value
variable-assignment
02 сен. 2010, в 13:39
8 ответов
Когда я учился на получение степени бакалавра в EE, MATLAB требовал, чтобы каждая функция определялась в собственном файле, даже если она была однострочным. Сейчас я учусь в аспирантуре, и мне нужно написать проект в MATLAB. Это все еще требование для более новых версий MATLAB? Если в файл можно пом...
scope
file
function
function-declaration
25 авг. 2010, в 20:16
11 ответов
Я часто слышу, как люди жалуются, как дорого стоят MATLAB. Тогда мне интересно, почему они не просто используют Octave или R. Но верно ли последнее? Можете ли вы использовать R для замены MATLAB?
scientific-computing
15 нояб. 2009, в 15:24
4 ответа
Я экспериментирую с MATLAB OOP, в качестве начала я подражал моим классам С++ Logger, и я помещаю все свои вспомогательные функции строки в класс String, полагая, что было бы здорово сделать такие вещи, как a + b, a == b, a.find( b ) из strcat( a b ), strcmp( a, b ), получить первый элемент strfind(...
oop
benchmarking
profiling
matlab-class
07 нояб. 2009, в 15:24
8 ответов
Иногда полезно "клонировать" вектор строки или столбца в матрицу. Клонирование я имею в виду преобразование вектора строки, такого как [1,2,3] В матрицу [[1,2,3] [1,2,3] [1,2,3] ] или вектор столбца, такой как [1 2 3 ] в [[1,1,1] [2,2,2] [3,3,3] ] В matlab или октаве это делается довольно ...
numpy
linear-algebra
octave
11 окт. 2009, в 07:48
7 ответов
Есть ли у кого-нибудь успешный опыт чтения двоичных файлов Matlab.mat в Python? (Я видел, что scipy якобы поддерживает чтение файлов .mat, но я не увенчался успехом. Я установил scipy версию 0.7.0, и я не могу найти метод loadmat())
file-io
scipy
mat-file
17 май 2009, в 12:00
15 ответов
Возможно ли иметь аргументы по умолчанию в Matlab? Например, здесь: function wave(a,b,n,k,T,f,flag,fTrue=inline('0')) Я хотел бы, чтобы истинное решение было необязательным аргументом для волновой функции. Если это возможно, может ли кто-нибудь продемонстрировать правильный способ сделать это? В на...
arguments
default
28 апр. 2009, в 00:19
9 ответов
Можно ли получить возвращаемое значение "nth" из функции без необходимости создавать фиктивные переменные для всех возвращаемых значений n-1 до этого? Скажем, у меня есть следующая функция в MATLAB: function [a,b,c,d] = func() a = 1; b = 2; c = 3; d = 4; Теперь предположим, меня интересует только т...
function
return-value
14 апр. 2009, в 12:04
Наверх
Меню