代码之家  ›  专栏  ›  技术社区  ›  AnnaR

紧凑的MATLAB矩阵索引表示法

  •  8
  • AnnaR  · 技术社区  · 17 年前

    我有一个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
    
    3 回复  |  直到 16 年前
        1
  •  15
  •   Community Mohan Dere    6 年前

    如果要避免使用for循环,这可能是最干净的方法:

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

    indexmatrix 使用 num2cell k 列作为 comma-separated list sub2ind ,一个转换 下标索引 (行、列等)插入 线性指数 (每个矩阵元素的编号从1到 N , N 矩阵中元素的总数)。最后一行使用这些线性索引替换for循环。可以找到关于矩阵索引(下标、线性和逻辑)的良好讨论 here

    还有一些值得思考的东西。。。

    许多MATLAB用户(包括我自己)已经习惯了回避for循环而支持向量化解决方案的趋势。然而,新版本的MATLAB处理循环的效率要高得多。如中所述 this answer

    我当然不是说你不应该再尝试矢量化你的代码了,只是每个问题都是独一无二的。矢量化意志 经常 要更有效率,但不要浪费时间 总是 . 对于您的问题,For循环相对于矢量化代码的执行速度可能取决于值的大小 n 和 是

        2
  •  6
  •   Edric    17 年前

    处理向量的元素 indexmatrix(row, :) 作为单独的下标,需要将元素作为单元格数组。所以,你可以这样做

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

    要将子单元格展开为逗号分隔的列表,不幸的是,您确实需要这两行。但是,此代码独立于 k

        3
  •  0
  •   Shai    13 年前

    将你的子指数转换成线性指数的一个黑客的方式

    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 );
    

    干杯