I have a set of 6 XY wavelength/absorption datasets, each with a different concentration. I have formed them into a 312x7 XYZ matrix with the first row holding the Y-variables (concentration), and the first column holding the X-variables (wavelength). I have used this data format quite frequently in other programs, but I cannot figure out how to get Matlab to recognize the data properly. I would like to use Matlab to baseline correct the data and then solve for the molar absorptivity at each wavelength.
Example:
0 10 25 50 75 100
290 0.0 0.1 0.12 0.15 0.2 0.3
291 0.0 0.11 0.121 0.151 0.21 0.31
Thanks in advance for your help.

 채택된 답변

Cedric
Cedric 2013년 10월 15일
편집: Cedric 2013년 10월 15일

2 개 추천

EDIT: see my second solution for a more flexible approach.
=== 1st solution.
% - Read content.
fid = fopen( 'myFile.txt', 'r' ) ;
content = fscanf( fid, '%f', Inf ) ;
fclose( fid ) ;
% - Extact headers and data.
colHeader = content(1:6).' ;
content = reshape( content(7:end), 7, [] ).' ;
rowHeader = content(:,1) ;
data = content(:,2:end) ;
With that, you get..
>> colHeader
colHeader =
0 10 25 50 75 100
>> rowHeader
rowHeader =
290
291
>> data
data =
0 0.1000 0.1200 0.1500 0.2000 0.3000
0 0.1100 0.1210 0.1510 0.2100 0.3100
PS: there are other approaches, e.g. based on FGETL for the col. header and then TEXTSCAN, but I personnaly prefer reading the file in one shot and then reshaping/extracting numbers appropriately.
=== 2nd solution.
If the number of columns could vary among files though, I would go for a first step reading the first line of the file and determining dynamically the number of columns, before reading/processing the rest. For example:
fid = fopen( 'myFile.txt', 'r' ) ;
colHeader = sscanf( fgetl(fid), '%f' ).' ; % Read/convert 1st line only.
nDataCol = numel( colHeader ) ; % Determine # of data columns.
content = fscanf( fid, '%f', Inf ) ; % Read rest of the file.
fclose(fid) ;
content = reshape( content, nDataCol+1, [] ).' ;
rowHeader = content(:,1) ;
data = content(:,2:end) ;

댓글 수: 6

Jan
Jan 2013년 10월 15일
편집: Jan 2013년 10월 15일
@Cedric: "buffer" shadows the built-in function buffer. Although this command can solve some problems in the Matlab forums, I used it only one time for my real-world programs. So perhaps it is recommended to use another name, but I really do not know if the general rule is useful for rarely used functions.
Cedric
Cedric 2013년 10월 15일
편집: Cedric 2013년 10월 15일
@Jan: you are right, it's a bad habit of mine actually (that I refuse to loose because the term is so generic that, AFAIK, it was a mistake to name this built-in this way), especially because I know the built-in! However, I shouldn't propagate my bad habits ;-), so I'll update my answer.
I wanted to start a discussion about conflicting function names between toolboxes/libs/etc by the way. I'd love to have something like .. well see Jan's new thread!
Soren
Soren 2013년 10월 15일
Great! The data is in a .csv format. I think this is causing some issues in the parsing scheme.
% - Read content. fid = fopen( 'rawdata_array.csv', 'r' ) ; content = fscanf( fid, '%f', Inf ) ; fclose( fid ) ; % - Extact headers and data. colHeader = content(1:6).' ; buffer = reshape( content(7:end), 7, [] ).' ; rowHeader = buffer(:,1) ; data = buffer(:,2:end) ; Index exceeds matrix dimensions.
Thanks for your help in advance!
Cedric
Cedric 2013년 10월 15일
편집: Cedric 2013년 10월 15일
So the separator is the comma and the first line is starting with a comma (empty content for 1st element)? If so, loading the data is much simpler:
content = csvread( 'rawdata_array.csv' ) ;
colHeader = content(1,2:end) ;
rowHeader = content(2:end,1) ;
data = content(2:end,2:end) ;
Soren
Soren 2013년 10월 16일
Thank you very much for your quick and accurate assistance!
Soren
Cedric
Cedric 2013년 10월 16일
You're welcome!

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

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 Large Files and Big Data에 대해 자세히 알아보기

제품

질문:

2013년 10월 15일

댓글:

2013년 10월 16일

Community Treasure Hunt

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

Start Hunting!

Translated by