Matlab 3d-матрица

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

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

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

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

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

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

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

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

нзоров / массивов вам придется использовать обходной путь. Я могу думать о двух:

linear indexing cell arrays Linear indexing

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

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

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

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

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

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

Cell arrays

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

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

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

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

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

A{i,j,k}

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

ndsparse (N-мерные разреженные массивы FEX)

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