A.1.2 Матрицы и массивы в файлах Oct
Octave поддерживает ряд различных классов массивов и матриц, большинство из которых основаны на классе Array. Исключение составляют типы разреженных матриц, обсуждаемые отдельно ниже. Существует три основных типа матриц:
Matrix-
Класс матриц двойной точности, определенный в dMatrix.h
ComplexMatrix-
Класс матриц комплексных чисел, определенный в CMatrix.h
BoolMatrixКласс матриц булевых значений, определенный в boolMatrix.h
Это основные двумерные типы матриц Octave. Кроме того, существуют несколько типов многомерных массивов, включая
NDArray-
Класс массивов двойной точности, определенный в dNDArray.h
ComplexNDarray-
Класс массивов комплексных чисел, определенный в CNDArray.h
boolNDArray-
Класс массивов булевых значений, определенный в boolNDArray.h
int8NDArrayint16NDArrayint32NDArrayint64NDArray-
Классы массивов со знаками 8, 16, 32 и 64 бит, определенные в int8NDArray.h, int16NDArray.h и т. д.
uint8NDArrayuint16NDArrayuint32NDArrayuint64NDArrayКлассы массивов без знака 8, 16, 32 и 64 бит, определенные в uint8NDArray.h, uint16NDArray.h и т. д.
Существует несколько основных способов создания матриц или многомерных массивов. Используя класс Matrix в качестве примера, можно
- Создать пустую матрицу или массив с помощью пустого конструктора. Например:
Matrix a;
Это можно использовать для всех типов матриц и массивов.
- Определить размерности матрицы или массива с помощью dim_vector, который имеет те же характеристики, что и вектор, возвращаемый из
size. Например:dim_vector dv (2, 3); // 2 rows, 3 columns Matrix a (dv);
Это можно использовать для всех типов матриц и массивов.
- Определить количество строк и столбцов в матрице. Например:
Matrix a (2, 2)
Этот конструктор можно использовать только с типами матриц.
Все эти типы имеют ряд основных методов и операторов. Многие похожи на функции, существующие в интерпретаторе. Выбор полезных методов включает
- Метод: T& operator () (octave_idx_type)
- Метод: T& elem (octave_idx_type)
Оператор
()или методelemпозволяют считывать или устанавливать значения матрицы или массива. Эти методы принимают один аргумент типаoctave_idx_type, который представляет собой индекс в матрице или массиве. Кроме того, тип матрицы позволяет использовать двухаргументные версии оператора()и методаelem, предоставляя строковый и столбцовый индекс значения для получения или установки.
Обратите внимание, что эти функции выполняют значительную проверку ошибок, и поэтому в некоторых случаях пользователь может предпочесть напрямую получить доступ к данным массива или матрицы с помощью метода fortran_vec , описанного ниже.
- Метод: octave_idx_type numel (void) const
Общее количество элементов в матрице или массиве.
- Метод: size_t byte_size (void) const
Количество байтов, используемых для хранения матрицы или массива.
- Метод: dim_vector dims (void) const
Размерности матрицы или массива в значениях типа
dim_vector.
- Метод: int ndims (void) const
Количество измерений матрицы или массива. Матрицы всегда 2-мерные, но массивы могут быть N-мерными.
- Метод: void resize (const dim_vector&)
- Метод: void resize (nrows, ncols)
Метод, принимающий аргумент типа
dim_vector, или, в случае матрицы, два аргумента типаoctave_idx_type, определяющие количество строк и столбцов в матрице.
- Метод: T* fortran_vec (void)
Этот метод возвращает указатель на основанные данные матрицы или массива, чтобы их можно было манипулировать непосредственно, либо в Octave, либо внешней библиотекой.
Операторы, такие как +, -, или *, могут использоваться с большинством типов матриц и массивов. Кроме того, есть ряд методов, интересных только для матриц, таких как transpose, hermitian, solve, и т. д.
Типичный способ извлечения матрицы или массива из входных аргументов функции DEFUN_DLD выглядит следующим образом
#include <octave/oct.h>
DEFUN_DLD (addtwomatrices, args, , "Add A to B")
{
if (args.length () != 2)
print_usage ();
NDArray A = args(0).array_value ();
NDArray B = args(1).array_value ();
return octave_value (A + B);
} Чтобы избежать ошибок сегментации, приводящих к завершению работы Octave, эта функция явно проверяет, достаточно ли доступно аргументов, прежде чем обращаться к этим аргументам. Затем она получает два многомерных массива типа NDArray и складывает их. Обратите внимание, что метод array_value вызывается без использования метода is_matrix_type. Если при попытке извлечь значение произойдет ошибка, Octave выведет сообщение и бросит исключение. Причина предпочтения этой структуры кодирования заключается в том, что аргументы могут быть типом, который не является NDArray, но для которого было бы логично преобразовать их в один. Метод array_value позволяет выполнить это преобразование прозрачно, когда это возможно. Если вам нужно перехватывать такие ошибки и выполнять какие-либо действия по очистке или другие операции, вы можете перехватить исключение octave_execution_error.
A + B, действуя на двух объектах NDArray, возвращает NDArray, который преобразуется в octave_value при возврате из функции. Пример использования этой демонстрационной функции:
addtwomatrices (ones (2, 2), eye (2, 2))
⇒ 2 1
1 2 Ниже приведен список основных типов Matrix и Array, методы их извлечения из octave_value, и соответствующий заголовочный файл.
| Тип | Функция | Исходный код |
|---|---|---|
RowVector |
row_vector_value |
dRowVector.h |
ComplexRowVector |
complex_row_vector_value |
CRowVector.h |
ColumnVector |
column_vector_value |
dColVector.h |
ComplexColumnVector |
complex_column_vector_value |
CColVector.h |
Matrix |
matrix_value |
dMatrix.h |
ComplexMatrix |
complex_matrix_value |
CMatrix.h |
boolMatrix |
bool_matrix_value |
boolMatrix.h |
charMatrix |
char_matrix_value |
chMatrix.h |
NDArray |
array_value |
dNDArray.h |
ComplexNDArray |
complex_array_value |
CNDArray.h |
boolNDArray |
bool_array_value |
boolNDArray.h |
charNDArray |
char_array_value |
charNDArray.h |
int8NDArray |
int8_array_value |
int8NDArray.h |
int16NDArray |
int16_array_value |
int16NDArray.h |
int32NDArray |
int32_array_value |
int32NDArray.h |
int64NDArray |
int64_array_value |
int64NDArray.h |
uint8NDArray |
uint8_array_value |
uint8NDArray.h |
uint16NDArray |
uint16_array_value |
uint16NDArray.h |
uint32NDArray |
uint32_array_value |
uint32NDArray.h |
uint64NDArray |
uint64_array_value |
uint64NDArray.h |
© 1996–2022 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v5.2.0/Matrices-and-Arrays-in-Oct_002dFiles.html