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

7

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

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

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

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

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

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

Ваш Ответ

2   ответа
8

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

  1. линейное индексирование
  2. клеточные массивы

Линейная индексация

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

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

6

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

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