2010-04-25 9 views
1

Учитывая следующий пример:MATLAB: Как работает синтаксис (:)?

>> 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) возвращает короткий вектор строки?

+0

Я чувствую запах унаследованной поддержки. Матлаб полон такого рода вещей. –

+0

@Mike, это не наследие. Matlab - это просто совершенно другой тип языка, чем C, C++, Java, Python и т. Д. Он предназначен для математиков (которые используются для индексирования на основе 1), больше, чем для программистов. Хотя он полезен сам по себе (он имеет очень хорошую поддержку матрицы), некоторые из его функций (например, не кеширование функций и повторное открытие/закрытие файла для каждого вызова каждой функции) делают его не идеальным для чего-либо, кроме прототипирования. –

+0

@Mike: На самом деле, я считаю, что синтаксис '(:)' относительно * новый *, в отличие от старого синтаксиса сидения. – gnovice

ответ

7

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

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

Когда числовые значения включены в обе стороны от одного толстого кишечника, он обозначает диапазон linear indices в массив. Таким образом, 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 в индексе применяется к столбцам, поэтому выбираются столбцы один и два.

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

+0

Тогда как насчет 'I (1: 2)'? – user198729

+0

Я все еще думаю, что они одно и то же, не так ли? – user198729

+0

Таким образом, 'I (1: 2)' выбирает только значения в первом столбце, но 'I (:)' выбирает все значения в матрице, это что-то разумное? – user198729

0

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

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

I(1,2:3) 

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

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

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

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

+0

Как насчет '(a: b: c)'? ''() 'не может быть пропущен здесь для сравнения. – user198729

2

Примеры Matlab Indexing

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

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

 
x = M(i,j); 

Доступ всех элементов по строке я:

 
r = M(i,:); 

Доступ все предметы на Колонка J:

 
c = M(:,j); 

Доступ вход в строке I, Колонка J, лечения М в качестве вектора:

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

Доступа к подматрице из строки я к строке J и из колонки р на колонку д :

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

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

 
M = M(:,:); 

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

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

+0

В моем сообщении 'I' всего 2 строки, поэтому я думаю' (:) '=" все индексы "и' (1: 2) '=" все индексы ", так в чем разница? – user198729

+1

1: 2 просто означает индексы 1 ... 2 включительно (так 1 и 2). Аналогично, 2: 5 были бы индексами 2,3,4,5. Если вы опускаете индексные маркеры с двоеточием, только тогда он интерпретируется как «все индексы». –

+0

О, ваше объяснение имеет смысл сейчас. Но последняя проблема, почему 'I (:)' - это вектор столбца, но 'I (3: 4)' вектор строки? – user198729