Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我有一个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); 第一行使用num2cell将indexmatrix每一列放入单元格数组的单独单元格中。这使我们可以将所有k列作为逗号分隔的列表 sub2ind给sub2ind ,此函数将下标索引 (行,列等)转换为线性索引 (每个矩阵元素从1到N编号, N为总数)矩阵中的元素数)。最后一行使用这些线性索引替换您的for循环。在这里可以找到有关矩阵索引(下标,线性和逻辑)的很好的讨论。 一些值得深思的食物... 倾向于矢量化解决方案而避开for循环的趋势是许多MATLAB用户(包括我本人)已经习惯的事情。但是,较新版本的MATLAB可以更有效地处理循环。正如在对另一个SO问题的回答中所讨论的那样,使用for循环有时会导致代码运行速度比矢量解决方案快。 我当然不是在说您不应该再对代码进行矢量化处理,只是每个问题都是唯一的。向量化通常会更有效,但并非总是如此 。对于您的问题,for循环与矢量化代码的执行速度可能取决于值n和k大小。 更多&回答... |
![]() |
![]() |