【问题标题】:Find multiple row and column combinations in a matrix in Matlab在Matlab中查找矩阵中的多个行和列组合
【发布时间】:2013-08-01 23:34:38
【问题描述】:

我有以下矩阵:

>> MatrixA = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
MatrixA =
     1     2     3     4
     5     6     7     8
     9    10    11    12
    13    14    15    16

我想找到以下内容:

  • 对于第 1 行,我想要第 2 列
  • 对于第 2 行,我想要第 3 列
  • 对于第 3 行,我想要第 4 列
  • 对于第 4 行,我想要第 4 列

目前我通过以下行完成此操作:

>>diag(MatrixA([1 2 3 4], [2 3 4 4]))
ans =
     2
     7
    12
    16

有没有更直接的方法来做到这一点(不使用diag)?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    你可以使用sub2ind,它可能更直观。我认为没有太多好处,也许它更具可读性:

    ind = sub2ind(size(MatrixA), [1 2 3 4], [2 3 4 4])
    MatrixA(ind)
    

    【讨论】:

    • 仅供参考,这种方法的开销较小。 diag 方法首先创建一个 matrix(然后将其简化为一个向量),而 sub2ind 则从一开始就创建一个 vector。这对于大型矩阵可能很重要。
    • @EitanT:我将这两种解决方案都放在了for 循环中并运行了 100,000 次。 sub2ind 解决方案的执行时间为 1.6 秒。 diag 解决方案耗时 0.12 秒。如果矩阵更大,开销问题是否会在执行时间中发挥更大的作用?
    • 我也知道sub2inddiag 慢,但只有~1.5 倍。也许这是内存速度的权衡……很有趣。
    • JIT 和 diag 是本机函数(在最新版本的 Matlab 中),而 sub2ind 不是。
    • @EitanT:是的,sub2ind 应该是原生的。 diag 的旧非本地版本曾经非常慢,以至于我经常用 A(1:sz+1:end) 替换该函数,但现在与 diag 相比,对于大型矩阵来说,即使这样也更慢。如果 JIT 专门处理 diag(diag(A)),我也不会感到惊讶。
    猜你喜欢
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    相关资源
    最近更新 更多