Идея линейного индекса для массивов в 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
Как видите, восьмой элемент - это число 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, я считаю, что проблема была решена для тех счастливчиков, которые используют.)