2016-03-27 1 views
1

Я хотел бы хранить множество различных разреженных матриц в одну матрицу, что-то вроде этого:N-мерное индексирование допускается только для полноразмерных матриц. - проблема с использованием разреженных команды MATLAB

A(:,:,1) = sparse([0 0 1; 0 1 0]); 

A(:,:,2) = sparse([0 0 1; 0 0 0]); 

A(:,:,3) = sparse([1 0 1; 0 0 0]); 

A(:,:,4) = sparse([0 0 1; 0 1 0]); 

Но, я получаю ошибку:

N-мерную индексирование разрешено только для полноразмерных матриц.

Похоже, что другие столкнулись с этой проблемой: https://www.mathworks.com/matlabcentral/newsreader/view_thread/276098

но ссылка на «исправление ошибки» был сломан, и я не знаю, как справиться с этой проблемой. Я знаю, что я могу использовать клеточные массивы, но я знаю, что они медленные, и я стараюсь их избегать. Я предполагаю, что я мог бы также использовать команду full(), но я не уверен, что это лучший (самый быстрый) способ.

Любые идеи?

+0

Вам нужны редкие матрицы? В общем, они медленнее, чем обычные математические, но иногда неизбежные из-за ограничений памяти. –

+0

Кстати, эта ссылка неактуальна в любом случае, вот кешированная копия: http://web.archive.org/web/20100308064805/http://www.mathworks.com/access/helpdesk/help/techdoc/rn/bsdgysw- 1.html # bseheyh-1 – Amro

ответ

2

Проще говоря, вы не можете создавать N-мерные разреженные массивы в MATLAB, они должны быть двумерными матрицами.

Кроме того, типы поддерживаемых либо double или только logical (хотя есть hacks создать single разреженные матрицы, но они в конечном счете бесполезны для любого фактического использования).

Если вы хотите хранить кратные разреженные матрицы, вы должны использовать тип контейнера (например, массивы ячеек или структуры).


Рант: притязание, что сотовые массивы медленно является необоснованным. Это не имеет большого значения, если вы зацикливались на arr(:,:,i) или arr{i}, если только цель заключалась в том, чтобы выполнить векторную операцию на всем ND-массиве (не поддерживается для разреженных массивов). Так что просто подумайте о массиве ячеек как о массиве указателей, а arr{i} просто удаляет указатель, чтобы добраться до другого массива ...