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