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

📄 spmmat2rtc.m

📁 toolbox of BVQX, This is the access between BV and matlab. It will help you to analysis data from BV
💻 M
字号:
function [rtc, rtcs] = spmmat2rtc(spmmat, rtcfile)
% spmmat2rtc  - convert a SPM.mat file into BV's RTC file(s)
%
% FORMAT:       [rtc, rtcs] = spmmat2rtc(spmmat, rtcfile)
%
% Input fields:
%
%       spmmat      either SPM.mat filename or struct with fields
%        .SPM       1x1 struct containing loaded struct
%             - or -
%        .xX        design structure
%          .X       design matrix
%          .name    names of predictors
%
% Output fields:
%
%       rtc         RTC object of first session
%       rtcs        cell array with RTC objects of all session
%
% See also spmmat2prt

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

% argument check
if nargin < 2 || ...
   (~ischar(spmmat) && ...
    ~isstruct(spmmat)) || ...
    isempty(spmmat) || ...
   ~ischar(rtcfile) || ...
    isempty(rtcfile)
    error( ...
        'BVQXtools:BadArgument', ...
        'Missing or bad argument. Try ''help %s''.', ...
        mfilename ...
    );
end

% what is spmmat
if ischar(spmmat)
    try
        spmmat = load(spmmat(:)');
        spmmat.SPM;
    catch
        error( ...
            'BVQXtools:BadArgument', ...
            'Invalid SPM.mat filename given.' ...
        );
    end
end
if numel(spmmat) ~= 1
    error( ...
        'BVQXtools:BadArgument', ...
        'Bad dim/size of spmmat argument.' ...
    );
end
if isfield(spmmat, 'SPM')
    spmmat = spmmat.SPM;
end
if numel(spmmat) ~= 1 || ...
   ~isfield(spmmat, 'xX') || ...
   ~isstruct(spmmat.xX) || ...
    numel(spmmat.xX) ~= 1 || ...
   ~isfield(spmmat.xX, 'X') || ...
    isempty(spmmat.xX.X) || ...
   (~isa(spmmat.xX.X, 'double') && ...
    ~isa(spmmat.xX.X, 'single')) || ...
   ~isfield(spmmat.xX, 'name') || ...
   ~iscell(spmmat.xX.name) || ...
    numel(spmmat.xX.name) ~= size(spmmat.xX.X, 2)
    error( ...
        'BVQXtools:BadArgument', ...
        'Invalid SPM.mat structure given.' ...
    );
end
xX = spmmat.xX.X;
nampred = spmmat.xX.name(:);

% parse session numbers
numpred = numel(nampred);
sespred = zeros(1, numpred);
baspred = zeros(1, numpred);
for pc = 1:numpred
    if ~ischar(nampred{pc}) || ...
        numel(nampred{pc}) < 7 || ...
       ~strcmpi(nampred{pc}(1:3), 'sn(')
        error( ...
            'BVQXtools:BadArgument', ...
            'Session not detectable from predictor names.' ...
        );
    end
    snnum = nampred{pc}(4:5);
    snnum(snnum == ')') = [];
    try
        snnum = str2double(snnum);
    catch
        error( ...
            'BVQXtools:BadArgument', ...
            'Session not detectable from predictor names.' ...
        );
    end
    sespred(pc) = snnum;
    if ~isempty(regexpi(nampred{pc}, '.*constant$'))
        baspred(pc) = 1;
    end
end
sessno = numel(unique(sespred));

% generate RTCs
[rtcabs{1:2}] = isabsolute(rtcfile(:)');
[rtcp{1:3}] = fileparts(rtcabs{2});
rtcs = cell(1, sessno);
for sc = 1:sessno
    
    % get baseline column (to detect time indices)
    nsess = min(sessno(sessno > 0));
    bsi = find((baspred > 0) & (sespred == nsess));
    if numel(bsi) ~= 1
        clearbvqxobjects(rtcs);
        error( ...
            'BVQXtools:InternalError', ...
            'Error retrieving unique baseline predictor for session %d.', ...
            sc ...
        );
    end
    sti = find(xX(:, bsi) > 0);
    nti = numel(sti);
    
    % get predictor columns and names
    csi = find((baspred == 0) & (sespred == nsess));
    csn = nampred(csi);
    for pc = 1:numel(csn)
        csn{pc} = regexprep(csn{pc}, ...
            '^sn\(\d+\)\s*([^\s\*]*)\*?.*$', '$1', 'preservecase');
    end
    
    % build RTC
    newrtc = bless(BVQXfile('new:rtc'), 1);
    rtcs{sc} = newrtc;
    newrtc.FileVersion = 2;
    newrtc.Type = 'DesignMatrix';
    newrtc.NrOfPredictors = numel(csn);
    newrtc.NrOfDataPoints = nti;
    newrtc.PredictorNames = csn(:)';
    newrtc.RTCMatrix = xX(sti, csi);
    
    % saving
    try
        if sessno > 1
            newrtc.SaveAs(sprintf('%s/%s-run%d.rtc', rtcp{1}, rtcp{2}, sc));
        else
            newrtc.SaveAs(rtcfile(:)');
        end
    catch
        clearbvqxobjects(rtcs);
        error( ...
            'BVQXtools:BVQXfileError', ...
            'Error saving RTC to file: ''%s''.', ...
            lasterr ...
        );
    end
    
end

% clean objects
if nargout < 2 && ...
    sessno > 1
    clearbvqxobjects(rtcs(2:end));
end
rtc = rtcs{1};

⌨️ 快捷键说明

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