MATLAB - Difficulty in getting desired output with Struct -
i have matlab code i've written i'm having problem doesn't give required answer..
when run
track = readtrack('test1.gpx'); disp(track); i answer in form of
1x4 struct array containing fields: name points but ideally test should like
scalar structure containing fields:
name = test #1 points = 0.00000 0.00000 0.00000 0.00000 2.00000 2.10000 0.00000 7.00000 4.50000 0.00000 10.00000 10.00000 any suggestions how change code , how?
thanks!! :)
here code.
function data = readtrack(filename) %creates struct fields 'name' , 'points' data extracted %from gpx file. uses supporting functions. fid=fopen(filename); if fid == -1 result = error (filename); else [data,name,point] = setup(fid); while length(point) > 9 [pointstruct, point] = findlatlongelev(point,fid,name); data = [data pointstruct]; end end end function result = error(filename) % displays error message , produces empty struct sprintf('file ''%s'' not found.',filename); result = struct(); end function [data,name,point] = setup(fid) %set function, finds name , gets right place find %points data=[]; lineskip(3,fid); name = findnameorelevation(fid); lineskip(13, fid); point = fgetl(fid); end function lineskip(n, fid) %skips lines i=1:n fgetl(fid); end end function result = findnameorelevation(fid) % finds name, used find elevation data presented % in similar formats line = fgetl(fid); findstart = strfind(line,'>'); findfinish = strfind(line,'<'); printstart = findstart(1)+1; printfinish = findfinish(2)-1; result = line(printstart:printfinish); end function [pointstruct, point] = findlatlongelev(point,fid,name) % finds latitude, longitude , elevation , creates struct field % entry each set of points apostrophes = strfind(point, '"'); latstart = apostrophes(1)+1; latfinish = apostrophes(2)-1; longstart = apostrophes(3)+1; longfinish = apostrophes(4)-1; trackpoint(1) = str2double(point(latstart:latfinish)); trackpoint(2) = str2double(point(longstart:longfinish)); trackpoint(3)= str2double(findnameorelevation (fid)); fgetl(fid); point = fgetl(fid); pointstruct = struct(... 'name',name,... 'points', trackpoint); end
i hope can relationship between scalar struct , stuct array right here. guess 1 row in scalar field supposed correspond 1 element same field struct array. question edited make clearer if correct. answer,
in function readtrack explicitly state want have struct array.
while length(point) > 9 [pointstruct, point] = findlatlongelev(point,fid,name); data = [data pointstruct]; % <--here! adds element array of structs. end to have scalar struct can catenate each element instead.
while length(point) > 9 [pointstruct, point] = findlatlongelev(point,fid,name); data.name = [data.name; mat2cell(pointstruct.name,1,length(pointstruct.name))]; data.point = [data.point; pointstruct.point]; end however, need convert name cell since strings not of same length , should in cases* not assumed such. need done in setup
data={}; i however, guess code more readable if rathered kept current output catenated fields afterwards in separate function. can done each field vertcat. however, still "matrix dimensions not consistent" error unless strings of same length or field data.name cell. can done loop since field names can obtained function fieldnames.
* exception may if string used represent else, eg. 8 characters can used represent 64-bit integer.