Массив матриц в MATLAB

33

Я ищу способ хранения большого числа переменных в массиве в MATLAB.

Есть ли способы достичь этого?

Пример:

for i: 1:unknown
  myArray(i) = zeros(500,800);
end

Если неизвестной является различная длина массива, я могу пересмотреть с дополнительной информацией, если это необходимо.

Обновление: Производительность - главная причина, по которой я пытаюсь это сделать. У меня было это раньше, когда он будет захватывать данные как одну матрицу, показывать ее в режиме реального времени, а затем переходить к обработке следующего набора данных.

Я попытался использовать многомерные массивы, как предложено ниже компанией Rocco, однако мои данные настолько велики, что у меня закончилась память, мне, возможно, придется изучить другую альтернативу для моего случая. Будет обновляться, когда я буду пытаться сделать другие предложения.

Обновление 2: Спасибо всем за предложения, однако я должен был заранее указать, что точность и скорость являются неотъемлемым фактором здесь, мне, возможно, придется взглянуть на исходный метод, прежде чем пытаться использовать 3-мерные массивы и переоценить метод импорта данных.

  • 0
    Я думаю, что использование клеточных матриц не повлияет на производительность вообще. Поскольку они по существу содержат указатели на фактические матрицы, их расширение (даже при динамическом индексировании) не должно приводить к снижению производительности (за исключением минимального перераспределения массива указателей, что незначительно).
Теги:
arrays
matrix

6 ответов

40
Лучший ответ

Если все матрицы будут иметь одинаковый размер (т.е. 500x800), вы можете просто создать 3D-массив:

nUnknown;  % The number of unknown arrays
myArray = zeros(500,800,nUnknown);

Чтобы получить доступ к одному массиву, вы должны использовать следующий синтаксис:

subMatrix = myArray(:,:,3);  % Gets the third matrix

Вы можете добавить несколько матриц в myArray несколькими способами:

myArray = cat(3,myArray,zeros(500,800));
% OR
myArray(:,:,nUnknown+1) = zeros(500,800);

Если каждая матрица не будет того же размера, вам нужно будет использовать массивы ячеек, как предположил Хозам.

EDIT: я пропустил часть из-за нехватки памяти. Я предполагаю, что ваш nUnknown достаточно велик. Возможно, вам придется переключать тип данных матриц (один или даже тип uintXX, если вы используете целые числа). Вы можете сделать это при вызове нулей:

myArray = zeros(500,800,nUnknown,'single');
  • 3
    Проблема с использованием трехмерного массива состоит в том, что он требует непрерывного пространства в памяти. Хотя он может иметь лучшую производительность, чем массивы ячеек, последний позволяет размещать двумерные матрицы в разных пространствах памяти, что делает его более подходящим при использовании с фрагментированной памятью.
61

Используйте ячейки массивов. Это имеет преимущество перед 3D-массивами в том, что для хранения всех матриц не требуется непрерывное пространство памяти. Фактически, каждая матрица может быть сохранена в другом пространстве в памяти, что избавит вас от ошибок при отсутствии памяти, если ваша свободная память фрагментирована. Вот примерная функция для создания ваших матриц в массиве ячеек:

function result = createArrays(nArrays, arraySize)
    result = cell(1, nArrays);
    for i = 1 : nArrays
        result{i} = zeros(arraySize);
    end
end

Чтобы использовать его:

myArray = createArrays(requiredNumberOfArrays, [500 800]);

И для доступа к вашим элементам:

myArray{1}(2,3) = 10;

Если вы не можете заранее знать количество матриц, вы можете просто использовать динамическую индексацию MATLAB, чтобы сделать массив настолько большим, насколько вам нужно. Накладные расходы производительности будут пропорциональны размеру массива ячеек и не зависят от размера самих матриц. Например:

myArray{1} = zeros(500, 800);
if twoRequired, myArray{2} = zeros(500, 800); end
  • 0
    впечатляет, спасибо
  • 0
    @yunas Не за что.
Показать ещё 2 комментария
0

просто сделайте это так

x=zeros(100,200);
for i=1:100
  for j=1:200
    x(i,j)=input('enter the number');
  end
end
  • 0
    Это не отвечает на вопрос.
0

Я делал рендеринг объема в октаве (клон matlab) и создавал свои 3D-массивы (т.е. массив из 2d-секторов), используя

buffer=zeros(1,512*512*512,"uint16");
vol=reshape(buffer,512,512,512);

Потребление памяти показалось эффективным. (не может сказать то же самое для последующей скорости вычислений: ^)

0

myArrayOfMatrices = zeros (неизвестно, 500 800), если у вас заканчивается память, бросьте больше бара в вашей системе и убедитесь, что вы используете 64-разрядную ОС. Также попробуйте уменьшить свою точность (вам действительно нужно удваивать или вы можете обойтись с помощью синглов: myArrayOfMatrices = single (неизвестно, 500 800);

Чтобы добавить к этому массиву, попробуйте: myArrayOfMatrices (неизвестно + 1,:,:) = нули (500 800);

-1

если вы знаете, что неизвестно,

вы можете сделать что-то вроде

myArray = zeros(2,2);
for i: 1:unknown
  myArray(:,i) = zeros(x,y);
end

Однако прошло некоторое время с тех пор, как я в последний раз использовал matlab. поэтому эта страница может пролить свет на вопрос:

http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/matlab_prog/f1-86528.html

  • 1
    Вам нужен 3-мерный массив для этого. Ваш пример может вызвать ошибку из-за несоответствия размеров массива. Вы, вероятно, имеете в виду myArray(:,:,i) , хотя я не уверен, как он будет себя вести (поскольку у меня сейчас нет MATLAB).
  • 0
    Я думаю, что вы правы. Я раньше не сталкивался с камерой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню