Spec-Zone.ru › Octave 6

A.1.6.1 Различия между классами массивов и разреженных матриц

Количество элементов в разреженной матрице считается количеством ненулевых элементов, а не произведением размерностей. Поэтому,

SparseMatrix sm;
…
int nnz = sm.nelem ();

возвращает количество ненулевых элементов (как и функция интерпретатора nnz). Если пользователю действительно требуется количество элементов в матрице, включая ненулевые, он должен использовать numel вместо nelem. Обратите внимание, что для очень больших матриц, где произведение двух размерностей превышает представление беззнакового целого числа, numel может переполниться. Примером является speye (1e6), который создаст матрицу с миллионом строк и столбцов, но только с миллионом ненулевых элементов. В этом случае произведение числа строк на число столбцов превышает в двести раз максимальное значение, которое может быть представлено беззнаковым 32-битным целым числом. Поэтому следует избегать использования numel, если не известно, что переполнения не произойдёт.

Также следует проявлять особую осторожность при использовании метода elem или оператора (), которые выполняют по существу ту же функцию. Причина в том, что если объект разреженной матрицы не является константным, Octave предположит, что запрос на нулевой элемент в разреженной матрице фактически является запросом на создание этого элемента для его заполнения. Следовательно, фрагмент кода, подобный

SparseMatrix sm;
…
for (int j = 0; j < nc; j++)
  for (int i = 0; i < nr; i++)
    std::cerr << " (" << i << "," << j << "): " << sm(i,j) << "\n";

является отличным способом превращения разреженной матрицы в плотную, и весьма медленным способом, поскольку он перераспределяет объект разреженной матрицы для каждого нулевого элемента в матрице.

Простым способом предотвращения вышеописанного является создание временной константной версии разреженной матрицы. Обратите внимание, что будет скопирована только контейнер для разреженной матрицы, а фактическое представление данных будет разделено между двумя версиями разреженной матрицы; Это не является дорогостоящей операцией. Приведенный выше пример, переписанный для предотвращения преобразования разреженной матрицы в плотную, выглядит следующим образом:

SparseMatrix sm;
…
const SparseMatrix tmp (sm);
for (int j = 0; j < nc; j++)
  for (int i = 0; i < nr; i++)
    std::cerr << " (" << i << "," << j << "): " << tmp(i,j) << "\n";

Наконец, поскольку типы разреженных матриц не представлены непрерывным блоком памяти, метод fortran_vec из Array<T> недоступен. Однако его заменяют три отдельных метода ridx, cidx, и data, которые обращаются к формату сжатых столбцов, в котором хранятся разреженные матрицы Octave. Эти методы можно использовать аналогично elem, чтобы получить доступ к матрице или заполнить её. Однако пользователь должен соблюдать формат сжатых столбцов разреженной матрицы, иначе матрица будет повреждена.

© 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/v6.4.0/Array-and-Sparse-Class-Differences.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API