【问题标题】:Compact MATLAB matrix indexing notation紧凑的 MATLAB 矩阵索引符号
【发布时间】:2010-10-22 00:24:51
【问题描述】:

我有一个 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

【问题讨论】:

    标签: matlab indexing matrix notation


    【解决方案1】:

    如果您想避免使用 for 循环,这可能是最简洁的方法:

    indexCell = num2cell(indexmatrix, 1);
    linearIndexMatrix = sub2ind(size(kDimensionalMatrix), indexCell{:});
    finalTable = kDimensionalMatrix(linearIndexMatrix);
    

    第一行使用num2cellindexmatrix 的每一列放入元胞数组的单独元胞中。这允许我们将所有k 列作为comma-separated list 传递给sub2ind,该函数将下标索引(行、列等)转换为线性索引 (每个矩阵元素从 1 到 N 编号,N 是矩阵中元素的总数)。最后一行使用这些线性索引来替换你的 for 循环。可以在here 找到关于矩阵索引(下标、线性和逻辑)的一个很好的讨论。

    还有一些值得深思的东西......

    许多 MATLAB 用户(包括我自己)已经习惯了避开 for 循环而支持矢量化解决方案的趋势。但是,较新版本的 MATLAB 处理循环的效率更高。正如 this answer 对另一个 SO 问题所讨论的那样,使用 for 循环有时会导致比使用矢量化解决方案更快地运行代码。

    我当然不是说你不应该再尝试向量化你的代码,只是每个问题都是独一无二的。矢量化经常会更有效,但并非总是。对于您的问题,for 循环与矢量化代码的执行速度可能取决于 nk 的值有多大。

    【讨论】:

      【解决方案2】:

      以一种老套的方式将您的子索引转换为线性索引

      ksz = size(kDimensionalMatrix);
      cksz = cumprod([ 1 ksz(1:end-1)] );
      lidx = ( indexmatrix - 1 ) * cksz' + 1; #'
      % lindx is now (n)x1 linear indices into kDimensionalMatrix, one index per row of indexmatrix
      % access all n values:
      selectedValues = kDimensionalMatrix( lindx );
      

      干杯!

      【讨论】:

        【解决方案3】:

        要将向量indexmatrix(row, :) 的元素视为单独的下标,您需要将这些元素视为一个元胞数组。所以,你可以做这样的事情

        subsCell = num2cell( indexmatrix( row, : ) );
        finalTable( row ) = kDimensionalMatrix( subsCell{:} );
        

        要将 subsCell 扩展为逗号分隔列表,不幸的是,您确实需要两个单独的行。但是,这段代码独立于k

        【讨论】:

        • 太棒了!你也可以让它独立于行数吗?
        • @AnnaR - 我刚刚发布了一个可以同时处理所有n 行的indexmatrix 的答案。
        猜你喜欢
        • 1970-01-01
        • 2018-03-26
        • 2012-10-31
        • 2021-06-21
        • 2011-12-24
        • 2014-05-12
        • 2013-09-13
        • 2014-06-08
        • 2015-11-08
        相关资源
        最近更新 更多