【问题标题】:Converting a matlab matrix to a vector将 matlab 矩阵转换为向量
【发布时间】:2010-12-28 05:48:07
【问题描述】:

我想在预定义的位置获取 Matlab 矩阵的元素向量。例如,我有以下

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

A =

     1     2     3     4
     5     6     7     8
     9    10    11    12
    13    14    15    16

我想要一个向量,它可以在与i,j 对应的位置上为我提供A 的值。我试过了

A(i,j)

ans =

     1     3     4
     5     7     8
     9    11    12

但这不是我想要的。我想得到以下内容

>> [A(i(1),j(1)); A(i(2),j(2));A(i(3),j(3))]

ans =

     1
     7
    12

matlab 的语法是什么?请避免建议循环或任何不是矢量化形式的东西,因为我需要快速完成。希望会有一些内置功能。

【问题讨论】:

    标签: matlab vector matrix


    【解决方案1】:

    要了解如何做到这一点,最好了解 matlab 如何存储其数组。在矩阵中:

    i = [1,2,3];
    j = [1,3,4];
    A = [1,2,3,4; 5,6,7,8; 9,10,11,12; 13,14,15,16]
    

    matlab 存储向下列的元素。所以它们实际上是按顺序驻留在内存中的:

    {1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16}
    

    您实际上可以使用 SINGLE 索引来索引二维数组。这就是 sub2ind 技巧起作用的原因。由于您想要获取的元素是第 1 个、第 10 个和第 15 个元素,按列顺序存储,

    singleIndex = [1 10 15];
    A(singleIndex)
    ans =
         1     7    12
    

    要确认 sub2ind 提供了该索引列表,请尝试...

    ind = sub2ind([4 4],i,j)
    ind =
         1    10    15
    

    【讨论】:

      【解决方案2】:

      要以最快的方式获得它,请使用线性索引

      A((j-1)*size(A,1)+i)
      

      请记住,MATLAB 使用列优先顺序。

      【讨论】:

        【解决方案3】:
        A(sub2ind(size(A),i,j))
        

        如果您真的渴望速度,您可以尝试制作自己的 sub2ind.m 副本,去除该函数所做的所有输入检查。

        【讨论】:

          【解决方案4】:

          现在我正在使用这个:

          >> diag(A(i,j))
          
          ans =
          
               1
               7
              12
          

          【讨论】:

          • 虽然这会起作用,但一般来说这是一个糟糕的选择,因为它首先在内存中创建一个新的 3x3 矩阵,然后使用 diag 函数将该矩阵的大部分放入位桶中。如果您的数组和 (i,j) 中的点列表很大,那么诊断技巧将非常低效。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-12-25
          • 2017-06-10
          • 1970-01-01
          • 2012-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多