从给定id的矩阵中删除行-Matlab
如何根据第一列的值从矩阵中删除某一行 例如:从给定id的矩阵中删除行-Matlab,matlab,matrix,row,Matlab,Matrix,Row,如何根据第一列的值从矩阵中删除某一行 例如:A=[1 2 3;3 4 5;5 6 7] 其中第一列的值表示id,我想删除id为5的行。 我已经知道A(3,:)=[]删除了第三行,但是如果我有id但不知道行号怎么办?您可以使用查找: id=5; A(find(A(:,1)==id),:)=[] A = 1 2 3 3 4 5 A(3,:) 请注意,正如所提到的,由于采用了逻辑索引,您甚至可以省略查找: id=5; A(find(A(:,1)==id),:)
A=[1 2 3;3 4 5;5 6 7]
其中第一列的值表示id,我想删除id为5的行。
我已经知道
A(3,:)=[]
删除了第三行,但是如果我有id但不知道行号怎么办?您可以使用查找
:
id=5;
A(find(A(:,1)==id),:)=[]
A =
1 2 3
3 4 5
A(3,:)
请注意,正如所提到的,由于采用了逻辑索引,您甚至可以省略查找
:
id=5;
A(find(A(:,1)==id),:)=[]
A =
1 2 3
3 4 5
A(3,:)
及
是这样吗
A(find(A(:,1)==id),:)=[]
及
将给出相同的结果。如果您只有id为
的元素,那么我将使用。但是,如果碰巧有一个元素数组作为id
,则可以使用下面列出的方法之一
进近#1(带)
A(ismember(A(:,1),ids),:) = [];
A(any(bsxfun(@eq,A(:,1),ids(:)'),2),:) = [];
[~,remove_rowid] = intersect(A(:,1),ids);
A(remove_rowid,:) = [];
[~,select_rowid] = setdiff(A(:,1),ids,'stable');
A = A(select_rowid,:);
进近#2(带)
A(ismember(A(:,1),ids),:) = [];
A(any(bsxfun(@eq,A(:,1),ids(:)'),2),:) = [];
[~,remove_rowid] = intersect(A(:,1),ids);
A(remove_rowid,:) = [];
[~,select_rowid] = setdiff(A(:,1),ids,'stable');
A = A(select_rowid,:);
如果A
的第一列有唯一的id
,那么您还有两种方法可以使用
进近#3(带)
A(ismember(A(:,1),ids),:) = [];
A(any(bsxfun(@eq,A(:,1),ids(:)'),2),:) = [];
[~,remove_rowid] = intersect(A(:,1),ids);
A(remove_rowid,:) = [];
[~,select_rowid] = setdiff(A(:,1),ids,'stable');
A = A(select_rowid,:);
进近#4(带)
A(ismember(A(:,1),ids),:) = [];
A(any(bsxfun(@eq,A(:,1),ids(:)'),2),:) = [];
[~,remove_rowid] = intersect(A(:,1),ids);
A(remove_rowid,:) = [];
[~,select_rowid] = setdiff(A(:,1),ids,'stable');
A = A(select_rowid,:);
你可以省略find
,因为逻辑索引会处理它。@Divakar你是这样的发现是无用的(也许只是为了更容易理解)。好吧,如果你熟悉逻辑索引,那就很容易理解,而且速度也必须快得多,这就是我的意思。我同意你的看法,没有find
更好。谢谢你的建议。然而,我不确定它在计算上是否有显著差异。我运行了一些测试,并有类似的运行时。但是,我还是同意,并且会在我的代码中删除find
!不管是否重要,至少我可以保证它会更快,因为我们正在切断find
:)的函数调用