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_typenumel() const Общее количество элементов в матрице или массиве.
-
Метод:
size_tbyte_size() const Количество байтов, используемых для хранения матрицы или массива.
-
Метод:
dim_vectordims() const Размерности матрицы или массива в виде значения типа
dim_vector.
-
Метод:
intndims() const Количество измерений матрицы или массива. Матрицы всегда двумерны, а массивы могут иметь N измерений.
-
Метод:
voidresize(const dim_vector&) -
Метод:
voidresize(nrows, ncols) Метод, принимающий аргумент типа
dim_vectorили, в случае матрицы, два аргумента типаoctave_idx_type, задающих количество строк и столбцов матрицы.
-
Метод:
T *fortran_vec() Этот метод возвращает указатель на базовые данные матрицы или массива, чтобы их можно было изменять напрямую — в 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–2026 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/v9.4.0/Matrices-and-Arrays-in-Oct_002dFiles.html