⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vmr_coordinateframe.m

📁 toolbox of BVQX, This is the access between BV and matlab. It will help you to analysis data from BV
💻 M
字号:
function vmrc = vmr_CoordinateFrame(hfile, opts)
% VMR::CoordinateFrame  - generate coordinate matrices of VMR
%
% FORMAT:       vmrc = vmr.CoordinateFrame([opts]);
%
% Input fields:
%
%       opts        optional struct with settings
%        .dirs      compute directions (default true)
%        .first     compute coordinate of first voxel (default false)
%        .ndgrid    run ndgrid with VMR resolution (default false)
%        .offsize   get start/end pos (offset + size, default true)
%        .origin    compute origin (center of STC data, default true)
%        .trans     compute transformation matrix (default true)
%        .transinv  compute inverse matrix (default false)

% Version:  v0.7b
% Build:    7090217
% Date:     Sep-02 2007, 5:08 PM CEST
% Author:   Jochen Weber, Brain Innovation, B.V., Maastricht, NL
% URL/Info: http://wiki.brainvoyager.com/BVQXtools

% argument check
if nargin < 1 || ...
    numel(hfile) ~= 1 || ...
   ~isBVQXfile(hfile, 'vmr')
    error( ...
        'BVQXfile:BadArgument', ...
        'Invalid call to %s.', ...
        mfilename ...
    );
end
bc = bvqxfile_getcont(hfile.L);
if nargin < 2 || ...
   ~isstruct(opts) || ...
    numel(opts) ~= 1
    opts = struct;
end
if ~isfield(opts, 'dirs') || ...
   ~islogical(opts.dirs) || ...
    isempty(opts.dirs)
    opts.dirs = true;
else
    opts.dirs = opts.dirs(1);
end
if ~isfield(opts, 'first') || ...
   ~islogical(opts.first) || ...
    isempty(opts.first)
    opts.first = false;
else
    opts.first = opts.first(1);
end
if ~isfield(opts, 'ndgrid') || ...
   ~islogical(opts.ndgrid) || ...
    isempty(opts.ndgrid)
    opts.ndgrid = false;
else
    opts.ndgrid = opts.ndgrid(1);
end
if ~isfield(opts, 'offsize') || ...
   ~islogical(opts.offsize) || ...
    isempty(opts.offsize)
    opts.offsize = true;
else
    opts.offsize = opts.offsize(1);
end
if ~isfield(opts, 'origin') || ...
   ~islogical(opts.origin) || ...
    isempty(opts.origin)
    opts.origin = true;
else
    opts.origin = opts.origin(1);
end
if ~isfield(opts, 'trans') || ...
   ~islogical(opts.trans) || ...
    isempty(opts.trans)
    opts.trans = true;
else
    opts.trans = opts.trans(1);
end
if ~isfield(opts, 'transinv') || ...
   ~islogical(opts.transinv) || ...
    isempty(opts.transinv)
    opts.transinv = false;
else
    opts.transinv = opts.transinv(1);
end

% get resolution
rsx = bc.VoxResX;
rsy = bc.VoxResY;
rsz = bc.VoxResZ;
dmx = bc.DimX;
dmy = bc.DimY;
dmz = bc.DimZ;

% get slice centers
cs1 = [bc.Slice1CenterX; bc.Slice1CenterY; bc.Slice1CenterZ];
csn = [bc.SliceNCenterX; bc.SliceNCenterY; bc.SliceNCenterZ];
css = mean([cs1, csn], 2);
drs = csn - cs1;
drs = drs ./ sqrt(sum(drs .* drs));

% get directions
drx = [bc.RowDirX; bc.RowDirY; bc.RowDirZ];
dry = [bc.ColDirX; bc.ColDirY; bc.ColDirZ];
drx = drx ./ sqrt(sum(drx .* drx));
dry = dry ./ sqrt(sum(dry .* dry));
drz = -cross(drx, dry);
cnv = 1;
if sum(drs .* drz) < 0
    drz = -drz;
    cnv = 0;
end
if abs(sum(drs .* drz) - 1) > 0.01
    error( ...
        'BVQXfile:InvalidObject', ...
        'Fields Slice*Center* and ***Dir* don''t match.' ...
    );
end
trf = [[drx, dry, drz, css]; [0, 0, 0, 1]];

% build output
vmrc = struct;

% set resolution
vmrc.DimX = dmx;
vmrc.DimY = dmy;
vmrc.DimZ = dmz;

% set directions
if opts.dirs
    vmrc.DirC = cnv;
    vmrc.DirX = drx;
    vmrc.DirY = dry;
    vmrc.DirZ = drz;
end

% compute origin
if opts.first
    fst = cs1 - ((rsx - 1) * dmx / 2) * drx + ((rsy - 1) * dmy / 2) * dry;
    vmrc.First = fst;
end

% ndgrid
if opts.ndgrid
    [opts.NDgrid{1:3}] = ndgrid(0:(rsx - 1), 0:(rsy - 1), 0:(rsz - 1));
end

% inverse transformation
if opts.transinv
    vmrc.InverseTrans = inv(trf);
end

% get offset and size
if opts.offsize
    if isfield(bc, 'OffsetX')
        vmro = [bc.OffsetX, bc.OffsetY, bc.OffsetZ];
    else
        vmro = [0, 0, 0];
    end
    vmrc.OffSize = [vmro; vmro + [dmx, dmy, dmz] - 1];
end

% set origin
if opts.origin
    vmrc.Origin = css;
end

% set resolution
fmrc.ResX = rsx;
fmrc.ResY = rsy;
fmrc.ResZ = rsz;

% set trans
if opts.trans
    vmrc.Trans = trf;
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -