我有一个 n×k 大小的矩阵,每行包含 k 个数字。我想使用这 k 个数字作为 k 维矩阵的索引。在 MATLAB 中是否有任何紧凑的方法可以做到这一点,或者我必须使用 for 循环?
这就是我想要做的(在 MATLAB 伪代码中),但以更 MATLAB 风格的方式:
for row=1:1:n
finalTable(row) = kDimensionalMatrix(indexmatrix(row, 1),...
indexmatrix(row, 2),...,indexmatrix(row, k))
end
如果您想避免使用 for 循环,这可能是最简洁的方法:
indexCell = num2cell(indexmatrix, 1);
linearIndexMatrix = sub2ind(size(kDimensionalMatrix), indexCell{:});
finalTable = kDimensionalMatrix(linearIndexMatrix);
第一行将每一列indexmatrix
使用元胞数组的单独元胞num2cell https://www.mathworks.com/help/matlab/ref/num2cell.html。这使我们能够通过所有k
列作为逗号分隔的列表 https://www.mathworks.com/help/matlab/matlab_prog/comma-separated-lists.html into sub2ind https://www.mathworks.com/help/matlab/ref/sub2ind.html,一个转换的函数下标索引(行、列等)到线性指数(每个矩阵元素编号从 1 到N
, N
是矩阵中元素的总数)。最后一行使用这些线性索引来替换 for 循环。关于矩阵索引(下标、线性和逻辑)的很好的讨论可以找到here http://www.mathworks.com/company/newsletters/digest/sept01/matrix.html.
还有一些值得思考的地方...
许多 MATLAB 用户(包括我自己)已经习惯了回避 for 循环而支持向量化解决方案的趋势。然而,较新版本的 MATLAB 处理循环的效率要高得多。正如中所讨论的这个答案 https://stackoverflow.com/a/831964/52738对于另一个 SO 问题,使用 for 循环有时会比使用矢量化解决方案获得更快的代码运行速度。
我当然不是说你不应该再尝试矢量化你的代码,只是每个问题都是独一无二的。矢量化意志often更有效率,但不是always。对于您的问题,for 循环与向量化代码的执行速度可能取决于值有多大n
and k
are.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)