Matlab 3d-матрица

Я должен создать очень большую трехмерную матрицу (такую как:500000x60x60). Есть ли способ сделать это в Matlab?

Когда я пытаюсь

omega = zeros(500000,60,60,'single');

Я получаюout-of-memory ошибка.

Разреженная функция не вариант, так как она предназначена только для 2D матриц. Так есть ли альтернатива этому для матриц более высокой размерности?

 Scipion28 сент. 2012 г., 18:41
Моя матрица редкая. Но дело в том, что я нене могу найти, как создать разреженную матрицу в matlab, когда размерность больше 2. Андрей, как я уже говорил, моя проблема возникла из-за "недостаточно памяти" ошибка. Это'причина, почему я могусоздать эту матрицу.
 Oli28 сент. 2012 г., 18:08
Пожалуйста, опишите, почему вы не смогли создать эту матрицу. Кроме того, сообщите нам, если ваша матрица разрежена.
 Andrey Rubshtein28 сент. 2012 г., 18:08
Использоватьsparse команда для создания разреженной матрицы
 cjh28 сент. 2012 г., 19:15
Я думаю, что вы ищете разреженный тензор. Посмотрите на ответ наэтот вопрос .
 Axel Isouard28 сент. 2012 г., 17:52
Добро пожаловать в Stack Overflow, пожалуйста, покажите нам, что вымы сделали, отредактировав свой вопрос.

Ответы на вопрос(2)

Решение Вопроса

Matlab поддерживает только разреженные матрицы (2D). Для 3D-тензоров / массивов выпридется использовать обходной путь. Я могу думать о двух:

линейное индексированиеклеточные массивыЛинейная индексация

Вы можете создать разреженный вектор следующим образом:

A = spalloc(500000*60*60, 1, 100); 

где последняя запись (100) относится к количеству ненулей, которые в конечном итоге будут назначеныA, Если вы знаете это количество заранее, это делает использование памяти дляA более эффективным. Если вы нене знаю этого заранее, просто используйте какое-то число рядом с ним, этовсе еще буду работать, ноA может потреблять больше памяти в конце, чем это строго необходимо.

Затем вы можете ссылаться на элементы, как если бы это был трехмерный массив, например:

A(sub2ind(size(A), i,j,k)) 

где ,ij а такжеk являются индексами для 1-го, 2-го и 3-го измерения соответственно.

Сотовые массивы

Создайте каждую 2D-страницу в 3D-тензоре / массиве как массив ячеек:

a = cellfun(@(x) spalloc(500000, 60, 100), cell(60,1), 'UniformOutput', false);

Та же самая история идет для этого последнего входа вspalloc, Затем объединить в 3D следующим образом:

A = cat(3, a{:});

тогда вы можете ссылаться на отдельные элементы следующим образом:

A{i,j,k}

где ,ij а такжеk являются индексами для 1-го, 2-го и 3-го измерения соответственно.

Поскольку ваша матрица редкая, попробуйте использоватьndsparse (N-мерные разреженные массивы FEX)

Ваш ответ на вопрос