Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从给定id的矩阵中删除行-Matlab_Matlab_Matrix_Row - Fatal编程技术网

从给定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
:)的函数调用