Removing Rows From a Matrix by Label Quickly
1 次查看(过去 30 天)
显示 更早的评论
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?
5 个评论
Walter Roberson
2013-6-27
cell2mat() could fail there because the lines might not be exactly the same length. You could cellstr() to ensure the shorter lines are padded with blanks.
However, textscan() cannot accept arrays of char as the first argument (or cell array of char either.) You would have to reconstruct as a single string with \n between the lines in order to use textscan in this manner.
textscan(sprintf('%s\n', out{:}), .....)
回答(1 个)
Walter Roberson
2013-6-26
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.
3 个评论
Walter Roberson
2013-6-27
perl is part of the MATLAB distribution on MS Windows, so there is no need to install it. On OS-X and Linux, I believe those are defined to include perl as part of the operating system, so there is no need to install perl on those systems either.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Data Import and Export 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!