📄 spmmat2rtc.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 + -