Вопрос по matlab, sparse-matrix – Matlab 3d-матрица

7

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

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

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

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

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

Использоватьsparse команда для создания разреженной матрицы Andrey Rubshtein
Пожалуйста, опишите, почему вы не смогли создать эту матрицу. Кроме того, сообщите нам, если ваша матрица разрежена. Oli
Я думаю, что вы ищете разреженный тензор. Посмотрите на ответ наthis question . cjh
Добро пожаловать в Stack Overflow. Пожалуйста, покажите нам, что вы сделали, отредактировав свой вопрос. Axel Isouard
Моя матрица редкая. Но дело в том, что я не нашел, как создать разреженную матрицу в matlab, когда размерность больше 2. Андрей, как я уже говорил, моя проблема возникла из-за нехватки памяти. ошибка. Это причина, по которой я не могу создать эту матрицу. Scipion

Ваш Ответ

2   ответа
6

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

8

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

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-го измерения соответственно.

Похожие вопросы