Если вы хотите избежать использования цикла for, это, вероятно, самый чистый способ сделать это:
indexCell = num2cell(indexmatrix, 1);
linearIndexMatrix = sub2ind(size(kDimensionalMatrix), indexCell{:});
finalTable = kDimensionalMatrix(linearIndexMatrix);
Первая строка помещает каждый столбец indexmatrix
в отдельные ячейки массива ячеек, используя num2cell
. Это позволяет нам передавать все k
столбцы как список через запятую в sub2ind
, функцию, которая преобразует индексы с индексами (строка, столбец и т.д.) в линейные индексы (каждый матричный элемент пронумерован от 1 до N
, N
- общее количество элементов в матрице). Последняя строка использует эти линейные индексы для замены вашего цикла for. Хорошее обсуждение матричной индексации (подстрочное, линейное и логическое) можно найти здесь .
Еще немного пищи для размышлений ...
Тенденция уклоняться от циклов for в пользу векторизованных решений - это то, к чему привыкли многие пользователи MATLAB (включая меня). Тем не менее, новые версии MATLAB обрабатывают циклы гораздо эффективнее. Как обсуждалось в , этот ответ на другой вопрос SO, использование циклов for может иногда приводить к более быстрому выполнению кода, чем если бы вы использовали векторизованное решение.
Я, конечно, НЕ говорю, что вы не должны пытаться векторизовать свой код больше, только то, что каждая проблема уникальна. Векторизация часто будет более эффективной, но не всегда . Для вашей проблемы скорость выполнения циклов for и векторизованного кода, вероятно, будет зависеть от того, насколько велики значения n
и k
.