Spec-Zone.ru › Octave 9

A.1.6.1 Различия между классами Array и Sparse

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

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

возвращает количество ненулевых элементов (как и функция интерпретатора nnz). Если пользователю действительно требуется количество элементов матрицы, включая ненулевые элементы, следует использовать numel вместо nelem. Обратите внимание, что для очень больших матриц, произведение двух размерностей которых превышает максимальное значение беззнакового int, может произойти переполнение numel. Например, speye (1e6) создаст матрицу с миллионом строк и столбцов, но всего с миллионом ненулевых элементов. В этом случае произведение числа строк на число столбцов более чем в двести раз превышает максимальное значение, представимое беззнаковым 32-разрядным int. Поэтому использования 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–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/Array-and-Sparse-Class-Differences.html

Spec-Zone.ru

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