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&оператор() (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¶ Количество измерений матрицы или массива. Матрицы всегда двумерные, но массивы могут быть многомерными.
-
Метод:
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–2023 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.2.0/Matrices-and-Arrays-in-Oct_002dFiles.html