如果您想避免使用 for 循环,这可能是最干净的方法:
indexCell = num2cell(indexmatrix, 1);
linearIndexMatrix = sub2ind(size(kDimensionalMatrix), indexCell{:});
finalTable = kDimensionalMatrix(linearIndexMatrix);
第一行使用 将 的每一列indexmatrix
放入元胞数组的单独元胞中num2cell
。这允许我们将所有k
列作为逗号分隔的列表传递给sub2ind
,该函数将下标索引(行、列等)转换为线性索引(每个矩阵元素从 1 编号到矩阵)。最后一行使用这些线性索引来替换你的 for 循环。可以在这里找到关于矩阵索引(下标、线性和逻辑)的一个很好的讨论。N
N
还有一些值得深思的...
许多 MATLAB 用户(包括我自己)已经习惯了回避 for 循环以支持矢量化解决方案的趋势。但是,较新版本的 MATLAB 处理循环的效率更高。正如另一个 SO question 的答案中所讨论的,使用 for 循环有时会导致比使用矢量化解决方案更快地运行代码。
我当然不是说你不应该再尝试向量化你的代码,只是每个问题都是独一无二的。矢量化通常会更有效,但并非总是如此。对于您的问题,for 循环与矢量化代码的执行速度可能取决于值的大小n
和k
大小。