diff extra/ncArray/inst/@ncArray/load.m @ 11980:de10a10ef6bf octave-forge

load data based on coordinate range or value (2)
author abarth93
date Mon, 29 Jul 2013 13:50:32 +0000
parents
children 7c7960da6a76
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extra/ncArray/inst/@ncArray/load.m	Mon Jul 29 13:50:32 2013 +0000
@@ -0,0 +1,67 @@
+% [val,coord1,coord2,...] = load(self,'coord_name1',range1,'coord_name2',range2,...)
+% Load a subset of a variable based on range of coordiante variables.
+% The names of the coordinates (coord_name1, coord_name2,...) coorespond to the standard_name attribute.
+% Only 1-dimensional coordinates are currently supported.
+%
+%
+% Example
+% [temp,lon,lat,depth,time] = load(self,'longitude',[0 10],'latitude',[0 10])
+
+function varargout = load(self,varargin)
+
+c = coord(self);
+
+for i = 1:length(c)
+  c(i).v = full(c(i).val);  
+  % per default take all data along a dimension
+  c(i).index = ':';
+  c(i).sub = c(i).v;
+end
+
+% loop over all constraints
+for i = 1:2:length(varargin) 
+  name = varargin{i};
+  
+  j = find(strcmp(name,{c.standard_name}));
+  if isempty(j)
+    warning(['no coordinate has the standard_name ' name ...
+             '. Try to use variable names.']);
+  
+    j = find(strcmp(name,{c.name}));
+    if isempty(j)
+      error(['no coordinate has the name ' name '.']);
+    end  
+  end
+    
+  range = varargin{i+1};
+  
+  if numel(range) == 1
+    dist = abs(c(j).v - range);
+    [mindist,i] = min(dist);
+    %mindist
+  else    
+    i = find(range(1) < c(j).v & c(j).v < range(end)); 
+    i = min(i):max(i);
+  end
+  
+  c(j).index = i;
+  c(j).sub = c(j).v(i);
+end
+
+idx = substruct('()',{c.index});
+data = subsref (self,idx);
+
+varargout = {data,c.sub};
+
+
+% i = 1;
+
+% mask = xr(1) <= x & x <= xr(2);
+% l = find(mask);
+
+% [ij{:}] = ind2sub(size(mask),l);
+
+% for j=1:len
+% mins(j) = min(ij{j});
+% maxs(j) = max(ij{j});
+