2012-03-20 8 views
0

У меня есть 2D-массив, содержащий пиксельные значения изображений. Я хочу сохранить их в массиве 1D. Как мне это сделать? И как я могу получить доступ к отдельным элементам в 2D-массиве через массив 1D?Доступ к массивам matlab

ответ

0

Во-первых, это может помочь узнать о вашей намеченной цели. Однако, если мы предположим, ваш массив называется Img, вы всегда можете использовать функцию reshape(), чтобы изменить изображение в новый массив с формой numel(Img) по 1:

new_Img = reshape(Img, numel(Img), 1); 

Согласно документации, это хранит записи столбцов что означает, что он сначала получает все элементы столбца 1, затем столбец 2 и т. д. Так что если вы хотите получить обратно запись (i,j) из оригинального двумерного массива Img, вы бы индекс в new_Img, как это (позволяя M быть число строк в матрице):

linear_indx = (j-1)*M+i; 
new_Img(linear_indx) == Img(i,j); 

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

0

Для массива P с размерами (M, N) заявление

reshape(P,[],1) 

будет возвращать (т * п) вектор-столбец; замените порядок последних двух аргументов, чтобы вернуть вектор строки. Будьте осторожны, если ваш массив пикселей (m, n), если у вас есть трижды RGB, например, ваш массив может быть (m, n, 3), и в этом случае вы должны быть немного умнее с изменением формы, но принцип остается тем же.

Вам не нужно ничего делать, чтобы использовать один индекс в 2D-массиве. Так, например, ссылка

P(i) 

будет возвращать I-й элемент массива подсчета элементов в порядке (1,1), (2,1), (3,1) ... то есть Matlab хранит массивы в колонке-крупный заказ

+0

Линейная индексация не ограничивается 2D массивов; все массивы MATLAB являются фактически линейными структурами данных. [Здесь] (http://www.mathworks.com/help/techdoc/math/f1-86528.html#f1-86846) есть некоторая документация, объясняющая вещи и предоставляющая формулу 'sub2ind' для массивов N-D. –

0

Вкратце:

B = A(:); 

Чтобы получить доступ к B используя те же показатели, как и в A:

B(sub2ind(size(A),i,j)); 

И полный пример:

% init 
A = randn(10,5); 
A(7,5) 
>>> -0.1904 

% 2-d -> 1-d 
B = A(:); 

% access 
B(sub2ind(size(A),7,5)) 
>>> -0.1904 
Смежные вопросы