【发布时间】:2015-01-26 12:28:34
【问题描述】:
如何根据第一列的值从矩阵中删除某一行?
例如:A=[1 2 3;3 4 5;5 6 7]
其中第一列的值表示 id,我想删除以 5 作为 id 的行。
我已经知道A(3,:)=[]删除了第三行,但是如果我有id不知道行号怎么办?
【问题讨论】:
如何根据第一列的值从矩阵中删除某一行?
例如:A=[1 2 3;3 4 5;5 6 7]
其中第一列的值表示 id,我想删除以 5 作为 id 的行。
我已经知道A(3,:)=[]删除了第三行,但是如果我有id不知道行号怎么办?
【问题讨论】:
你可以使用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,因为逻辑索引会处理它。
find 感谢您的建议。但是我不确定它是否会产生显着的计算差异。我进行了一些测试并有类似的运行时。但话又说回来,我仍然同意并会在我的代码中删除 find!
find的函数调用:)
如果您只有 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,:);
【讨论】: