【问题标题】:Remove a column from a matrix in GNU Octave从 GNU Octave 中的矩阵中删除一列
【发布时间】:2012-09-05 14:32:25
【问题描述】:

在 GNU Octave 中,我希望能够从矩阵中删除特定列。为了一般性。我还希望能够从矩阵中删除特定行。

假设我有这个:

mymatrix = eye(5)

mymatrix =

Diagonal Matrix

   1   0   0   0   0
   0   1   0   0   0
   0   0   1   0   0
   0   0   0   1   0
   0   0   0   0   1

我想删除第 2 列和第 4 列,但是当我删除第 2 列时,第 4 列的位置已经移动到第 3 列,这让我很头疼。必须有更好的方法!

【问题讨论】:

    标签: matrix octave


    【解决方案1】:

    如果您不知道确切的列数或行数,您可以使用神奇的“结束”索引,例如:

    mymatrix(:,2:end)  % all but first column
    
    mymatrix(2:end,:)  % all but first row
    

    这还允许您从矩阵中切出行或列,而无需将其重新分配给新变量。

    【讨论】:

    • 干净多了:D
    • 正是我想要的!
    【解决方案2】:

    GNU Octave 从矩阵中删除第 2 列和第 4 列

    mymatrix = eye(5); 
    mymatrix(:,[2,4]) = []; 
    disp(mymatrix)
    

    打印:

    1   0   0
    0   0   0
    0   1   0
    0   0   0
    0   0   1
    

    GNU Octave 从矩阵中删除第 2 行和第 4 行:

    mymatrix = eye(5); 
    mymatrix([2,4],:) = [];
    disp(mymatrix) 
    

    打印:

    1   0   0   0   0
    0   0   1   0   0
    0   0   0   0   1
    

    时间复杂度

    此处用于切片和广播的 GNU Octave 的 CPU 复杂度是快速线性时间O(n * c) 其中 n 是行数,c 是剩余的恒定行数。它是 C 级单核矢量化但不是并行的。

    内存复杂度

    工作内存的复杂性是线性的:O(n * 2) C 复制两个对象,遍历每个元素,然后删除原始元素。

    唯一会成为问题的时间是,如果您的矩阵太宽、太高,或者有许多维度会耗尽您的快速内存,并且速度受到磁盘和内存之间的传输速度的限制。

    【讨论】:

      【解决方案3】:

      执行此操作的相反方法:

      columns_you_want_to_keep = [1, 3, 5]
      new_matrix = my_matrix(:,columns_you_want_to_keep)
      

      【讨论】:

        【解决方案4】:

        如何去除八度音阶中的多列:

        如何删除第 2 列和第 4 列:

        columns_to_remove = [2 4];
        matrix(:,columns_to_remove)=[]
        

        图解:

        mymatrix = eye(5)
        mymatrix =
        
           1   0   0   0   0
           0   1   0   0   0
           0   0   1   0   0
           0   0   0   1   0
           0   0   0   0   1
        
        
        
        columns_to_remove = [2 4];
        
        mymatrix(:,columns_to_remove)=[]
        
        
        mymatrix =
        
           1   0   0
           0   0   0
           0   1   0
           0   0   0
           0   0   1 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-25
          • 2019-07-08
          • 2020-10-12
          相关资源
          最近更新 更多