I have a structure with fields of various dimensions – typically between 3 and 6. Each of the fields has one dimension that represents a sampling instance, but in some fields it is dimension 2, in others dimension 3 or 4. I need to extract a subset of the data from each of the fields by selecting samples along the relevant dimension, so if all of the fields were, say, 4D and the sampling dimension was 2 with ix as the selection, I could use:
flds = fieldnames(S.(inst))for i = 1:numel(flds) fld = flds{i}; S.(inst).(fld) = S.(inst).(fld)(:,ix,:,:); clear fldend; clear i
I can easily check the number of dimensions of the field and I can work out which dimension of the field I need to sample along, but I then end up with something like:
flds = fieldnames(S.(inst))for i = 1:numel(flds) fld = flds{i}; ndims = numel(size(S.(inst).(fld)); idir = find(size(S.(inst).(fld)) == Nsamples); % where Nsamples is the number of samples
if ndims == 3 if idir == 1 S.(inst).(fld) = S.(inst).(fld)(ix,:,:); elseif idir == 2 S.(inst).(fld) = S.(inst).(fld)(:,ix,:); else S.(inst).(fld) = S.(inst).(fld)(:,:,ix; end elseif ndims == 4 if idir == 1 S.(inst).(fld) = S.(inst).(fld)(ix,:,:,:) elseif idir == 2% etc
% etc end clear fld end; clear i
I wondered whether anyone could suggest a more elegant solution? I was thinking that it would be possible to dynamically generate the data selection (:,ix,:,:) as a text string and use it with eval, but I'm not sure that works with the dynamic naming of variables.
Any thoughts?
Best Answer