i my program for function 'slover' for manipulating structures. but there is error on running program -- ??? Error using ==>class The CLASS function must be called from a class constructor. Error in ==>slover at 172 o = class(defstruct, myclass)
1 次查看(过去 30 天)
显示 更早的评论
code is ------------
function [o, others] = slover(params, others, varargin) % class constructor for slice overlay (slover) object % FORMAT [o, others] = slover(params, others, varargin) % % Inputs % params - either: % - action string implementing class methods (see below) % - array of image names / vol structs to display % - structure with some fields for object (see below) % others - structure, containing extra fields for object (or children) % varargin - maybe some other parameters for action calls (see below) % % Outputs % o - slover object % others - any unrecognized fields from params, others % % Object fields are: % - img - array of structs with information for images to display % - img structs contain fields % type - one of {'truecolour' 'split', 'contour'}; % truecolour - displays transparent (see prop) image % overlaid with any previous % split - in defined area, replaces image present (SPM % type activation display) % contour - contour map of image overlaid. See help % for contours function in matlab % vol - vol struct info (see spm_vol) % can also be vol containing image as 3d matrix % set with add_blobs method % cmap - colormap for this image % nancol - color for NaN. If scalar, this is an index into % the image cmap. If 1x3 vector, it's a colour % prop - proportion of intensity for this cmap/img % func - function to apply to image before scaling to cmap % (and therefore before min/max thresholding. E.g. a func of % 'i1(i1==0)=NaN' would convert zeros to NaNs % range - 2x1 vector of values for image to distribute colormap across % the first row of the colormap applies to the first % value in 'range', and the last value to the second % value in 'range' % outofrange - behavior for image values to the left and % right of image limits in 'range'. Left means % colormap values < 1, i.e for image values < % range(1), if (range(1)<range(2)), and image values > % range(1) where (range(1)>range(2)). If missing, % display min (for Left) and max (for Right) value from colormap. % Otherwise should be a 2 element cell array, where % the first element is the colour value for image values % left of 'range', and the second is for image values % right of 'range'. Scalar values for % colour index the colormap, 3x1 vectors are colour % values. An empty array attracts default settings % appropriate to the mode - i.e. transparent colour (where % img(n).type is truecolour), or split colour. Empty cells % default to 0. 0 specifies that voxels with this % colour do not influence the image (split = % background, true = black) % hold - resampling order for image (see spm_sample_vol) - % default 1 % background - value when resampling outside image - default % NaN % linespec - string, applies only to contour map, % e.g. 'w-' for white continuous lines % contours - vector, applies to contour map only, defines % values in image for which to show contours % (see help contours) % linewidth - scalar, width in points of contour lines % % - transform - either - 4x4 transformation to apply to image slice position, % relative to mm given by slicedef, before display % or - text string, one of axial, coronal, sagittal % These orientations assume the image is currently % (after its mat file has been applied) axially % oriented % - slicedef - 2x3 array specifying dimensions for slice images in mm % where rows are x,and y of slice image, and cols are neg max dim, % slice separation and pos max dim % - slices - vector of slice positions in mm in z (of transformed image) % - figure - figure handle for slice display figure % The object used for the display is attached as 'UserData' % to this figure % - figure_struct - stored figure parameters (in case figure dies and % needs to be recreated) % - refreshf - flag - if set or empty, refresh axis info for figure % else assume this is OK % - clf - flag, non zero -> clear figure before display. Redundant % if refreshf == 0 % - resurrectf - if not zero, and figure (above) does not exist, will % attempt to recreate figure with same area properties. % Otherwise painting will give an error. % - userdata - flag, non zero -> attaches object to figure when ploting, % for use by callbacks (default is 1) % - area - struct with fields % position - bottom left, x size y size 1x4 vector of % area in which to display slices % units - one of % inches,centimeters,normalized,points,{pixels} % halign - one of left,{center},right % valign - one of top,{middle},bottom % - xslices - no of slices to display across figure (defaults to an optimum) % - cbar - if empty, missing, no colourbar. If an array of integers, then % indexes img array, and makes colourbar for each cmap for % that img. Cbars specified in order of appearance L->R % - labels - struct can be: % - empty (-> default numerical labels) % - 'none' (string) (no labels) % - or contain fields: % colour - colour for label text % size - font size in units normalized to slice axes % format - if = cell array of strings = % labels for each slice in Z. If is string, specifies % sprintf format string for labelling in distance of the % origin (Xmm=0, Ymm=0) of each slice from plane containing % the AC, in mm, in the space of the transformed image % - callback - callback string for button down on image panels. THe % following examples assume that you have the 'userdata' % field set to 1, giving you access to underlying object % To print to the matlab window the equivalent position in % mm of the position of a mouse click on one of the image % slices, set callback to: % 'get_pos(get(gcf, ''UserData''))' % To print the intensity values of the images at the clicked point: % ['so_obj = get(gcf, ''UserData''); ' ... % 'point_vals(so_obj, get_pos(so_obj))'] % - printstr - string for printing slice overlay figure window, e.g. % 'print -dpsc -painters -noui' (the default) % - printfile - name of file to print output to; default 'slices.ps' % % Action string formats: % FORMAT [cmap warnstr] = slover('getcmap', cmapname) % Gets colormap named in cmapname string % % FORMAT [mx mn] = slover('volmaxmin', vol) % Returns maximum and minimum finite values from vol struct 'vol' % % FORMAT vol = slover('blobs2vol', XYZ, vals, mat) % returns (pseudo) vol struct for 3d blob volume specified % in matrices as above % % FORMAT vol = slover('matrix2vol', mat3d, mat) % returns (pseudo) vol struct for 3d matrix % input matrices as above % % FORMAT obj = slover('basic_ui' [,dispf]) % Runs basic UI to fetch some parameters, does display, returns object % If optional dispf parameter = 0, supresses display % % $Id: slover.m,v 1.2 2005/05/06 22:59:56 matthewbrett Exp $
myclass = 'slover';
% Default object structure defstruct = struct('img', [], ... 'transform', 'axial', ... 'slicedef', [], ... 'slices', [], ... 'figure', [], ... 'figure_struct', [], ... 'refreshf', 1, ... 'clf', 1, ... 'resurrectf', 1, ... 'userdata', 1, ... 'area', [], ... 'xslices', [], ... 'cbar', [], ... 'labels', [], ... 'callback', ';', ... 'printstr', 'print -dpsc -painters -noui', ... 'printfile', 'slices.ps');
if nargin < 1 o = class(defstruct, myclass); others = []; return end if nargin < 2 others = []; end
% parse out string action calls (class functions) if ischar(params) switch params case 'getcmap' if nargin < 2 error('Need colormap name'); end o = pr_getcmap(others); return case 'volmaxmin' if nargin < 2 error('Need volume to calculate max/min'); end [o others] = pr_volmaxmin(others); return case 'blobs2vol' if nargin < 4 error('Need XYZ, vals, mat'); end o = pr_blobs2vol(others, varargin{:}); return case 'matrix2vol' if nargin < 3 error('Need matrix and mat'); end o = pr_matrix2vol(others, varargin{:}); return case 'basic_ui' o = pr_basic_ui(others, varargin{:}); if ~isempty(o), o = paint(o); end return end
% if not action string, must be filename(s)
params = spm_vol(params);
end
% Could these just be image vol structs? if isfield(params, 'fname') for i = 1:prod(size(params)) obj.img(i).vol = params(i); end params = obj; end
% Deal with passed objects of this (or child) class if isa(params, myclass) o = params; % Check for simple form of call if isempty(others), return, end
% Otherwise, we are being asked to set fields of object
[p others] = mars_struct('split', others, defstruct);
o = mars_struct('ffillmerge', o, p);
return
end
% fill params with defaults, parse into fields for this object, children params = mars_struct('fillafromb', params, others); [params, others] = mars_struct('ffillsplit', defstruct, params);
% set the slover object o = class(params, myclass);
% refill with defaults o = fill_defaults(o);
return
function varargout = mars_struct(action, varargin) % multifunction function for manipulating structures % % To help the exposition a bit: % 'fill' in a name, means that values empty or missing % in one structure are fetched from another % % 'merge' means simply that missing fields are added, with % values, from a second structure (but not filled if empty) % % Each function needs to deal with the case of empty arguments % % FORMAT c = mars_struct('fillafromb', a, b, fieldns, flags) % fills structure fields empty or missing in a from those present in b % a, b are structures % fieldns (optional) is cell array of field names to fill from in b % c is returned structure % Is recursive, will fill struct fields from struct fields % flags may contain 'f', which Force fills a from b (all non empty % fields in b overwrite those in a) % flags may also contain 'r', which Restricts fields to write from b, to % those that are already present in a % % FORMAT [c, d] = mars_struct('split', a, b) % split structure a into two, according to fields in b % so that c becomes a structure which contains the fields % in a, that are also present in b, and d contains the fields % in a that are not present in b. b can be a structure % or a cell array of fieldnames % % FORMAT [d] = mars_struct('strip', a, b) % strips all fields present in b from those in a, % returning denuded structure as d. b can be a structure % or a cell array of fieldnames. 'strip' is just 'split' % but returning only the second argument % % FORMAT c = mars_struct('merge', a, b) % merges structure a and b (fields present in b added to a) % % FORMAT [c,d] = mars_struct('ffillsplit', a, b) % force fill, followed by split % All fields from a, that are also present in b, and not empty in b, % are replaced with the values in b; the result is returned as c % Any fields present in a, but not present in b, are returned in d % % FORMAT c = mars_struct('ffillmerge', a, b) % force fill followed by merge % performs 'ffillsplit' on a and b, then merges a and b % All fields present in a or b are returned in c, but % any fields present in both, now have the value from b % % FORMAT [c d] = mars_struct('splitmerge', a, b) % performs 'split' on a and b, creating c and d % then merges c with b. % d contains fields in a that were not present in b % c contains fields present in both, or just in b % % FORMAT z = mars_struct('isthere', a, b [, c [, d ...]) % returns 1 if field named in b is present in a % and field value is not empty. % The call is recursive if more than two arguments are passed % Thus with structure s = struct('one', struct('two', 3)) % mars_struct('isthere', s, 'one', 'two') returns 1 % % FORMAT z = mars_struct('getifthere', a, b [, c [, d ...]) % returns value of field named in b from a or [] if absent % Call is recursive, like 'isthere' above. % % FORMAT strs = mars_struct('celldisp', a) % returns output like disp(a) as a cell array % Useful for printing text description of structure % % $Id: mars_struct.m,v 1.13 2004/09/22 16:02:38 matthewbrett Exp $
if nargin < 1 error('Action needed'); end if nargin < 2 error('Must specify structure') end if nargin < 3 varargin = {varargin{:} []}; end [a b] = deal(varargin{1:2});
switch lower(action) case 'fillafromb' % Return for empty passed args if isempty(a), varargout = {b}; return, end if isempty(b), varargout = {a}; return, end if nargin < 4, fieldns = []; else fieldns = varargin{3}; end if isempty(fieldns) if ~isstruct(b), error('Need struct as 2nd argument'); end fieldns = fieldnames(b); end if nargin < 5, flags = ''; else flags = varargin{4}; end if isempty(flags), flags = ' ';end
if ischar(fieldns), fieldns=cellstr(fieldns);end
af = fieldnames(a)';
bf = fieldns';
% classify fields 0 = a~b, 1 = a&b, 2=b~a
cf = af;
ftype = ismember(af, bf);
if ~any(flags == 'r')
b_not_a = find(~ismember(bf, af));
cf = {cf{:} bf{b_not_a}};
ftype = [ftype ones(1, length(b_not_a))*2];
end
% cope with arrays of structures
alen = prod(size(a));
blen = prod(size(b));
maxlen = max(alen, blen);
for si=1:maxlen
ctmp = [];
for i=1:length(cf)
fn = cf{i};
switch ftype(i)
case 0 % a~b
fval = getfield(a(si), fn);
case 1 % shared field
bfc = getfield(b(si), fn);
if isempty(getfield(a(si), fn)) | ... % a field is empty
(any(flags == 'f' & ~isempty(bfc)))% or force fill
fval = bfc;
else % field not empty, could be struct -> recurse
fval = getfield(a(si),fn);
if isstruct(fval) & isstruct(bfc)
fval = mars_struct('fillafromb',fval,bfc);
end
end
case 2 % b~a
fval = getfield(b(si), fn);
case 3 % no field information, see below
fval = [];
end
if isempty(ctmp)
ctmp = struct(fn, fval);
else
ctmp = setfield(ctmp, fn, fval);
end
end
c(si) = ctmp;
if si == blen % reached end of bs, rest of b~a fields are empty
ftype = (ftype == 2) * 3;
elseif si == alen % end of a's rest of a~b fields are empty
ftype = (ftype == 0) * 2 + 1;
end
end
varargout = {c};
case 'split'
if isempty(a), varargout = {a,a}; return, end
if isempty(b), varargout = {b,a}; return, end
d = a;
c = [];
if ischar(b), b = {b};end
if isstruct(b), b = fieldnames(b);end
for bf = b(:)'
if isfield(a, bf{1})
c = setfield(c, bf{1}, getfield(a, bf{1}));
d = rmfield(d, bf{1});
end
end
varargout = {c, d};
case 'strip'
[c d] = mars_struct('split', a, b);
varargout = {d};
case 'merge'
if isempty(a), varargout = {b}; return, end
if isempty(b), varargout = {a}; return, end
c = a;
for bf = fieldnames(b)';
if ~isfield(a, bf{1})
c = setfield(c, bf{1}, getfield(b, bf{1}));
end
end
varargout = {c};
case 'ffillsplit'
if isempty(a) | isempty(b)
% Nothing in common, return unchanged
varargout = {a, b}; return
end
c = a; d = b;
cf = fieldnames(c);
for i=1:length(cf)
if isfield(d, cf{i})
dfc = getfield(d,cf{i});
if ~isempty(dfc)
c = setfield(c, cf{i}, dfc);
end
d = rmfield(d, cf{i});
end
end
varargout = {c,d};
case 'ffillmerge'
[a b] = mars_struct('ffillsplit', a, b);
varargout = {mars_struct('merge', a, b)};
case 'splitmerge'
[a c] = mars_struct('split', a, b);
varargout = {mars_struct('merge', a, b) c};
case 'isthere'
if isempty(a), varargout = {0}; return, end
c = mars_struct('getifthere', varargin{:});
varargout = {~isempty(c)};
case 'getifthere'
if isempty(a), varargout = {[]}; return, end
if isempty(b), varargout = {[]}; return, end
for v = 2:nargin-1
b = varargin{v};
if ~isfield(a, b)
varargout = {[]};
return
end
a = getfield(a, b);
end
varargout = {a};
case 'celldisp'
if isempty(a), varargout = {{}}; return, end
af = fieldnames(a);
c = {};
pad_len = size(char(af), 2) + 4;
pad_str = ['%' num2str(pad_len) 's: %s'];
for f = 1:length(af)
d = getfield(a, af{f});
cls = class(d);
sz = size(d);
szstr = sprintf('%dx', size(d));
szstr(end) = [];
switch cls
case 'char'
case {'double', 'float'}
d = ['[' num2str(d) ']'];
otherwise
d = sprintf('[%s %s]', szstr, cls);
end
c{f} = sprintf(pad_str, af{f}, d);
end
varargout = {c};
otherwise
error(['Suspicious action was ' action]);
end % switch
回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Data Type Identification 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!