Removing Rows From a Matrix by Label Quickly

3 views (last 30 days)
Joseph on 25 Jun 2013
I currently have some code that is destined to: import data as a matrix from a text file, read the data and delete any rows in the matrix that do not start with "H", delete the H label from the remaining rows, print this matrix to a text file. My code is as follows:
FID = fopen('Test_Data_2.txt','rt');
m=[];
while ~feof(FID)
l=fgetl(FID);
if~isempty(l)
if l(1:1)=='H'
m = [m;str2num(l(2:end))];
end
end
end
FID = fclose(FID);
dlmwrite('md_msd.out', m, 'delimiter', '\t', ...
'precision', 6)
This code works great for small data sets but I am going to have to use it for sets of 100000 rows or more. I need a way to speed up the process as my current code takes far too long. Is there any way I can make this code faster?
Joseph on 2 Jul 2013
Thanks for the help! I finally got the function to run in around 12 seconds for one of the larger data sets. Thank you!

Walter Roberson on 26 Jun 2013
Use other tools when it makes sense to do so. For example, in Linux or OS-X from their shells:
sed -e '/^\$|^[^H]/d', -e 's/^H//p' < Test_Data_2.txt > md_msd.out
Or perl
perl -e '/^H/ && s/^H// && print' < Test_Data_2.txt > md_msd.out
You can invoke perl from within MATLAB using the perl() command.
Joseph on 29 Jun 2013
OK, I understand. So to call perl to help execute the code above would I simply place:
perl -e '/^H/ && s/^H// && print' < Test_Data_2.txt > md_msd.out
in my MATLAB function? Or do I need to wire perl script that preforms the same operations as the above code?