МАТЛАБ: Как работает синтаксис (:)? - PullRequest
2 голосов
/ 25 апреля 2010

Учитывая следующий пример:

>> I=[2 1 3;3 2 4]

I =

     2     1     3
     3     2     4

>> I(:)

ans =

     2
     3
     1
     2
     3
     4

>> I(1:2)

ans =

     2     3

Почему I(:) возвращает вектор столбца, а I(1:2) возвращает более короткий вектор строки?

Ответы [ 3 ]

9 голосов
/ 25 апреля 2010

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

a = I(:);               % Create a column vector with ":"
a = reshape(I, [], 1);  % Create a column vector with RESHAPE

Когда числовые значения включены по обе стороны от одного двоеточия, это обозначает диапазон линейных индексов в массиве. Поэтому I(1:2) выбирает первый и второй элементы из I (то есть значения в первом столбце). Следует помнить, что синтаксис 1:2 фактически создает вектор [1 2], поэтому I(1:2) такой же, как I([1 2]). Поскольку линейный индекс [1 2] представляет собой вектор строки, возвращаемые значения имеют форму вектора строки [2 3]. Если вы используете индекс I([1; 2]) или I((1:2).'), линейный индекс представляет собой вектор столбца, поэтому возвращаемые значения будут иметь форму вектора столбца [2; 3].

Если у вас есть несколько индексов, разделенных запятыми, индексы применяются к различным измерениям индексируемой матрицы. Например, I(1:2, 1:2) вернет матрицу 2 на 2 [2 1; 3 2]. Первый 1:2 в индексе применяется к строкам, поэтому выбираются строки 1 и 2. Второй 1:2 в индексе применяется к столбцам, поэтому выбираются столбцы один и два.

Документация MATLAB, описывающая операторы двоеточия и индексирование матрицы , должна помочь вам лучше понять, как эффективно использовать :.

2 голосов
/ 25 апреля 2010

Примеры индексации Matlab

[rows,cols] = size(M); % M is a rows x cols matrix

Доступ к записи в строке i, столбце j:

x = M(i,j);

Доступ ко всем элементам в строке i:

r = M(i,:);

Доступ ко всем элементам в столбце j:

c = M(:,j);

Доступ к записи в строке i, столбце j, обработка M как вектора:

x = M(rows*(j-1)+i);

Доступ к подматрице из строки i в строку j и из столбца p в столбец q:

S = M(i:j,p:q);

Доступ ко всей матрице (избыточно):

M = M(:,:);

Объяснение
Оператор двоеточия либо дает диапазон индексов (1: 2 - это индексы в диапазоне от 1 до 2 включительно, а 3: 5 - диапазон 3, 4, 5), либо он дает весь диапазон для данного измерения, если нет диапазона указано.

Это в сочетании с тем фактом, что индексирование матрицы с помощью только одного индекса дает вам запись, которая будет получена в результате пошагового перехода по этому количеству записей (переход вниз по строкам, увеличение столбца и сброс строки после последней строки) вместо того, чтобы дать вам только указанную строку / столбец, вы получите ваши наблюдения.

0 голосов
/ 25 апреля 2010

(:) векторизует матрицу вдоль столбцов, то есть элементы считываются вдоль столбцов, объединяются в один столбец-вектор. a:b:c возвращает последовательность чисел от a до c с шагом b. Если b опущено, по умолчанию установлено значение 1.

Последовательность a:b:c может использоваться для линейного индексирования матрицы вдоль столбца. Если используется для индексации многомерного массива, он выбирает элементы по этому измерению. Например,

I(1,2:3) 

возвращает матрицу, образованную строками 1 и столбцами 2:3 из I, т.е. [1 3]

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

index = [1 2 3];
disp(I(index));

Выше показаны первые три элемента в главном порядке столбцов (вдоль столбцов), т.е. [2 ; 3 ; 1]

...