Подтвердить что ты не робот

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

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

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

Пример:

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

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

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

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

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

4b9b3361

Ответ 1

Если все матрицы будут иметь одинаковый размер (т.е. 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');

Ответ 2

Используйте ячейки массивов. Это имеет преимущество перед 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

Ответ 3

myArrayOfMatrices = zeros(unknown,500,800);

Если вам не хватает памяти, добавьте больше памяти в вашу систему и убедитесь, что вы используете 64-битную ОС. Также попробуйте уменьшить вашу точность (вам действительно нужны удвоения или вы можете обойтись одиночками?):

myArrayOfMatrices = zeros(unknown,500,800,'single');

Чтобы добавить этот массив, попробуйте:

myArrayOfMatrices(unknown+1,:,:) = zeros(500,800);

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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

x=zeros(100,200);
for i=1:100
  for j=1:200
    x(i,j)=input('enter the number');
  end
end