Идея линейного индекса для массивов в Matlab очень важна. Массив в MATLAB на самом деле представляет собой просто вектор элементов, разбросанных по памяти. MATLAB позволяет использовать либо индекс строки и столбца, либо один линейный индекс. Например,
A = magic(3)
A =
8 1 6
3 5 7
4 9 2
A(2,3)
ans =
7
A(8)
ans =
7
Мы можем увидеть порядок хранения элементов в памяти, развернув массив в вектор.
A(:)
ans =
8
3
4
1
5
9
6
7
2
Как видите, 8-й элемент — это число 7. На самом деле функция find возвращает свои результаты в виде линейного индекса.
find(A>6)
ans =
1
6
8
В результате мы можем получить доступ к каждому элементу общего массива n-d, используя один цикл. Например, если мы хотим возвести в квадрат элементы A (да, я знаю, что есть лучшие способы сделать это), можно сделать так:
B = zeros(size(A));
for i = 1:numel(A)
B(i) = A(i).^2;
end
B
B =
64 1 36
9 25 49
16 81 4
Во многих случаях линейный индекс более полезен. Преобразование между линейным индексом и двухмерными индексами (или выше) выполняется с помощью функций sub2ind и ind2sub.
Линейный индекс применяется вообще к любому массиву в Matlab. Таким образом, вы можете использовать его для структур, массивов ячеек и т. д. Единственная проблема с линейным индексом — это когда они становятся слишком большими. MATLAB использует 32-битное целое число для хранения этих индексов. Поэтому, если в вашем массиве более 2 ^ 32 элементов, линейный индекс завершится ошибкой. Это действительно проблема, только если вы часто используете разреженные матрицы, когда иногда это вызывает проблему. (Хотя я не использую 64-битную версию MATLAB, я считаю, что эта проблема была решена для тех счастливчиков, которые это делают.)
person
Community
schedule
17.04.2009