delete certain elements in a matrix

조회 수: 2 (최근 30일)
dav
dav 2013년 3월 14일
Is there any way to delete certain rows(with a pattern) in a matrix
like to delete rows 1,6,11,21,26,..... using a loop
Thanks.

채택된 답변

Azzi Abdelmalek
Azzi Abdelmalek 2013년 3월 14일
편집: Azzi Abdelmalek 2013년 3월 14일
A=rand(40,4)
v=[1 6 11 21 26]
w=sort(v);
for k=0:numel(v)-1
A(w(k+1)-k,:)=[]
end
  댓글 수: 7
Jan
Jan 2013년 3월 14일
@dav: Simply set a breakpoint in the code an let it run. In the first iteration the first row is deleted. In the 2nd iteration, you should not delete the 6th row, because in the first iteration the 6th row became the 5th one. Therefore (k-1) is subtracted from the index in the k.th iteration.
Nevertheless, a loop is an inefficient approach and suffers from the old Schlemiel the painter problem.
dav
dav 2013년 3월 14일
Thanks a lot

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Sven
Sven 2013년 3월 14일
편집: Sven 2013년 3월 14일
In a loop? Not really.
All at once? Absolutely.
DATA = rand(50,5);
rowsToDelete = [1,6,11,21,26];
DATA(rowsToDelete,:) = [];
If you mean that your rows to delete has the pattern of rows 1,6,11,16, etc, then just do this:
numRows = size(DATA,1);
rowsToDelete = [1:10:numRows 6:10:numRows];
DATA(rowsToDelete,:) = [];
  댓글 수: 3
Jan
Jan 2013년 3월 14일
This is much faster than a loop for large arrays. Shrinking arrays in a loop has the same drawback as letting them grow: In each iteration the new array must be allocated and the contents of the old one is copied. This is very expensive.
dav
dav 2013년 3월 14일
Thanks a lot

댓글을 달려면 로그인하십시오.


Jan
Jan 2013년 3월 14일
Alternative to Sven's approach:
Data = rand(50,5);
index = false(1, 50);
index(1:10:end) = true;
index(6:10:end) = true;
Data(index, :) = [];

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

태그

아직 태그를 입력하지 않았습니다.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by