Ann*_*naR 8 indexing matlab matrix notation
我有一个n-by-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
Run Code Online (Sandbox Code Playgroud)
gno*_*ice 15
如果你想避免使用for循环,这可能是最干净的方法:
indexCell = num2cell(indexmatrix, 1);
linearIndexMatrix = sub2ind(size(kDimensionalMatrix), indexCell{:});
finalTable = kDimensionalMatrix(linearIndexMatrix);
Run Code Online (Sandbox Code Playgroud)
第一行将每列indexmatrix放入单元阵列的单独单元格中num2cell.这使我们能够通过所有k的列作为逗号分隔的列表成sub2ind,其将一个功能下标指数(行,列等)转换成线性指数(每个矩阵元素编号从1到N,N是在元件的总数矩阵).最后一行使用这些线性索引来替换for循环.关于矩阵索引(下标,线性和逻辑)的讨论可以在这里找到.
很多MATLAB用户(包括我自己)已经习惯了这种趋势,避免使用循环来支持向量化解决方案.但是,较新版本的MATLAB可以更有效地处理循环.正如在另一个SO问题的答案中所讨论的,使用for循环有时会导致代码运行速度比使用矢量化解决方案时更快.
我当然不是说你不应该再试图对代码进行矢量化,只是每个问题都是独一无二的.矢量化通常会更有效,但并非总是如此.对于您的问题,为循环与量化代码执行速度可能会取决于有多大值n和k是.
要将向量的元素indexmatrix(row, :)视为单独的下标,您需要将元素作为单元格数组.所以,你可以做这样的事情
subsCell = num2cell( indexmatrix( row, : ) );
finalTable( row ) = kDimensionalMatrix( subsCell{:} );
Run Code Online (Sandbox Code Playgroud)
要将subsCell扩展为逗号分隔列表,遗憾的是,您确实需要两个单独的行.但是,此代码独立于k.