Массив матриц в MATLAB - PullRequest
       40

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

37 голосов
/ 21 января 2009

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

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

Пример:

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

Там, где неизвестно - переменная длина массива, я могу при необходимости внести дополнительную информацию.

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

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

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

Ответы [ 6 ]

68 голосов
/ 22 января 2009

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

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, чтобы сделать массив настолько большим, насколько вам нужно. Снижение производительности будет пропорционально размеру массива cell и не зависит от размера самих матриц. Например:

myArray{1} = zeros(500, 800);
if twoRequired, myArray{2} = zeros(500, 800); end
41 голосов
/ 22 января 2009

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

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);

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

РЕДАКТИРОВАТЬ: я пропустил часть о нехватке памяти. Я предполагаю, что ваш nUnknown довольно большой. Возможно, вам придется переключить тип данных матриц (одиночный или даже тип uintXX, если вы используете целые числа). Вы можете сделать это при обращении к нулям:

myArray = zeros(500,800,nUnknown,'single');
1 голос
/ 22 января 2009
myArrayOfMatrices = zeros(unknown,500,800);

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

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

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

myArrayOfMatrices(unknown+1,:,:) = zeros(500,800);
0 голосов
/ 28 июня 2016

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

x=zeros(100,200);
for i=1:100
  for j=1:200
    x(i,j)=input('enter the number');
  end
end
0 голосов
/ 22 января 2009

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

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

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

0 голосов
/ 22 января 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...