Я ищу способ хранения большого числа переменных в массиве в MATLAB.
Есть ли способы достичь этого?
Пример:
for i: 1:unknown
myArray(i) = zeros(500,800);
end
Если неизвестной является различная длина массива, я могу пересмотреть с дополнительной информацией, если это необходимо.
Обновление: Производительность - главная причина, по которой я пытаюсь это сделать. У меня было это раньше, когда он будет захватывать данные как одну матрицу, показывать ее в режиме реального времени, а затем переходить к обработке следующего набора данных.
Я попытался использовать многомерные массивы, как предложено ниже компанией Rocco, однако мои данные настолько велики, что у меня закончилась память, мне, возможно, придется изучить другую альтернативу для моего случая. Будет обновляться, когда я буду пытаться сделать другие предложения.
Обновление 2: Спасибо всем за предложения, однако я должен был заранее указать, что точность и скорость являются неотъемлемым фактором здесь, мне, возможно, придется взглянуть на исходный метод, прежде чем пытаться использовать 3-мерные массивы и переоценить метод импорта данных.
Если все матрицы будут иметь одинаковый размер (т.е. 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');
Используйте ячейки массивов. Это имеет преимущество перед 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
просто сделайте это так
x=zeros(100,200);
for i=1:100
for j=1:200
x(i,j)=input('enter the number');
end
end
Я делал рендеринг объема в октаве (клон matlab) и создавал свои 3D-массивы (т.е. массив из 2d-секторов), используя
buffer=zeros(1,512*512*512,"uint16");
vol=reshape(buffer,512,512,512);
Потребление памяти показалось эффективным. (не может сказать то же самое для последующей скорости вычислений: ^)
myArrayOfMatrices = zeros (неизвестно, 500 800), если у вас заканчивается память, бросьте больше бара в вашей системе и убедитесь, что вы используете 64-разрядную ОС. Также попробуйте уменьшить свою точность (вам действительно нужно удваивать или вы можете обойтись с помощью синглов: myArrayOfMatrices = single (неизвестно, 500 800);
Чтобы добавить к этому массиву, попробуйте: myArrayOfMatrices (неизвестно + 1,:,:) = нули (500 800);
если вы знаете, что неизвестно,
вы можете сделать что-то вроде
myArray = zeros(2,2);
for i: 1:unknown
myArray(:,i) = zeros(x,y);
end
Однако прошло некоторое время с тех пор, как я в последний раз использовал matlab. поэтому эта страница может пролить свет на вопрос:
myArray(:,:,i)
, хотя я не уверен, как он будет себя вести (поскольку у меня сейчас нет MATLAB).