【问题标题】:Delete row from matrix given an id- Matlab从给定 id-Matlab 的矩阵中删除行
【发布时间】:2015-01-26 12:28:34
【问题描述】:

如何根据第一列的值从矩阵中删除某一行?

例如:A=[1 2 3;3 4 5;5 6 7] 其中第一列的值表示 id,我想删除以 5 作为 id 的行。 我已经知道A(3,:)=[]删除了第三行,但是如果我有id不知道行号怎么办?

【问题讨论】:

    标签: matlab matrix row


    【解决方案1】:

    你可以使用find:

    id=5;
    A(find(A(:,1)==id),:)=[]
    A =
    
     1     2     3
     3     4     5
    

    请注意,正如 Divakar 所提到的,由于逻辑索引,您甚至可以省略 find

    A(3,:)
    

    A(logical([0 0 1]),:)
    

    等价

    A(find(A(:,1)==id),:)=[]
    

    A(A(:,1)==id,:)=[]
    

    会给出相同的结果。

    【讨论】:

    • 您可以省略 find,因为逻辑索引会处理它。
    • @Divakar 你发现没用(可能是为了更容易理解)
    • 好吧,如果有人精通逻辑索引,那将很容易理解并且必须更快,这就是我的意思。
    • 我同意你的看法,最好不要find 感谢您的建议。但是我不确定它是否会产生显着的计算差异。我进行了一些测试并有类似的运行时。但话又说回来,我仍然同意并会在我的代码中删除 find
    • 重要与否,至少我可以保证它会更快,因为我们正在切断find的函数调用:)
    【解决方案2】:

    如果您只有 id 元素,那么我会选择 @yoh.lej's solution。但是,如果您碰巧有一组元素为 id,则可以使用下面列出的方法之一。

    方法#1(使用ismember

    A(ismember(A(:,1),ids),:) = [];
    

    方法#2(使用bsxfun

    A(any(bsxfun(@eq,A(:,1),ids(:)'),2),:) = [];
    

    如果A 的第一列具有唯一的ids,那么您还有两种方法可以使用。

    方法#3(使用intersect

    [~,remove_rowid] = intersect(A(:,1),ids);
    A(remove_rowid,:) = [];
    

    方法#4(使用setdiff

    [~,select_rowid] = setdiff(A(:,1),ids,'stable');
    A = A(select_rowid,:);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 2021-08-23
      相关资源
      最近更新 更多