Processing large matrix faster

조회 수: 1(최근 30일)
Manolis Mylonakis
Manolis Mylonakis 2022년 6월 19일
편집: Stephen23 2022년 6월 19일
Hello everyone
I need to procces a large matrix (10.104.485x3) called "M". The first two columns are longitude and latitude and the third column is sea depth. I want to trace the coordinates that have depth bigger than 80m. So I try to make a matrix called "coods" with all the corresponding coordinates. Here follows my code:
%M = readmatrix('Bathymetry_Data.txt');
j=1;
for i=1:10104485;
if M(i,3)<-80
coods(j,1)=M(i,1); coods(j,2)=M(i,2);
j=j+1;
end
end
My problem is that the loop never seem to end. I tried pausing after 2 -3 hours and the "i" is still in the very beginning. My operational system has 8 gb Ram. Can anyone tell if I do something wrong, or If I can do anything to make the loop go faster.
Any help will be deeply appreciated, Thank's a lot in advance

채택된 답변

Stephen23
Stephen23 2022년 6월 19일
편집: Stephen23 2022년 6월 19일
Why are you using a loop? Use logical indexing:
M = readmatrix('Bathymetry_Data.txt');
X = M(:,3)<(-80);
coods = M(X,:);
  댓글 수: 1
Manolis Mylonakis
Manolis Mylonakis 2022년 6월 19일
Thank you so much, it works perfect.
Sorry but I as you can tell I am new to matlab

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

추가 답변(1개)

Bjorn Gustavsson
Bjorn Gustavsson 2022년 6월 19일
편집: Bjorn Gustavsson 2022년 6월 19일
This ought to be done in one go:
coods = M(:,M(:,3)<-80);
In the case you cannot do it in a vectorized way and cannot determine beforehand how big a matrix will be (which makes it impossible to pre-allocate the array), you should try to do the array-growing in blocks instead of element by element, say a couple of 1000 elements at a time and then crop the array down to size at the end.
HTH

Community Treasure Hunt

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

Start Hunting!

Translated by