- 首先创建4个矩阵
a = [1,1;1,1];
b = [2,2;2,2];
c = [3,3;3,3];
d = [4,4;4,4];
e = [5,5;5,5];
- 给data矩阵(4-D)赋值a,b
data(:,:,1,1) = a;
data(:,:,2,1) = b;
此时在变量里看到data是一个2×2×2矩阵,其中(1,1)位置放的是a矩阵,(2,1)放的是b矩阵
- 将data矩阵变成4维
data(:,:,1,2) = c;
此时可以发现,当把c矩阵赋值给data(:,:,1,2)的位置时,data就变成了4-D
接下来把矩阵d复制到data(:,:,2,2)的位置
data(:,:,2,2) = d;
此时矩阵data中的位置分布如下:
如此类推,接下来把剩下的e矩阵插入到data(:,:,3,1)
data矩阵就变成这样,就是说我们在data中(3,1)的位置赋值,而(3,2)的位置又不能空着,matlab会默认补上一个2×2的零矩阵。
那么,接下来测试一下我们上面的结论对不对。
f = [6,6;6,6];
data(:,:,3,2) = f ;
创建一个f矩阵,再把f矩阵赋值给data中(3,2)的位置,matlab反馈如下:
即我们以上的结论是正确的。
- 有了正确的理解4-D矩阵的情况下,接下来以SSVEP脑电数据来结合理解:
2021年BCI脑机接口比赛是在python环境下进行的,拿到的脑电信号数据格式是.pkl ,而我是在matlab下做分析的,因此我要将python下的存储格式转换到matlab上,这一过程也花了不少时间去学习如何弄。
import os
import pickle
from scipy import signal
from scipy.io import savemat
os.system('cls')
for name_i in range(1,5):
for block_i in range(1,4):
filename = 'F:/user/SSVEP/S'+str(name_i)+'/block'+str(block_i)+'.pkl'
fr = open(filename, "rb")
EEG = pickle.load(fr)
MatlabFileName = 'F:\user\SSVEP\S'+str(name_i)+'/block'+str(block_i)+'.mat'
savemat(MatlabFileName, EEG)
print('name_i : %d , block_i : %d' % (name_i,block_i) )
接下来要在matlab下处理脑电数据:
实验范式:
实验范式为键盘拼写,刺激包含40个目标(包括数字0-9、字母A-Z、“,”、“.”、空格和退格),刺激频率分别为8~15.8Hz,频率间隔0.2Hz,相邻频率之间相位差0.5π,具体如图1及表1所示。实验中,固定频率、相位的刺激通过对屏幕上每个目标亮度的正弦调制实现(亮度范围:0-255)。每个试次包含提示1秒,刺激4秒,反馈1秒。一个block共40个试次,每次实验共6个block用于测试。 测试数据中每个block随机删除2个trial,保留38个trial。被试视力或矫正视力正常,在实验过程中被要求集中注意力,刺激时注视提示的目标。实验中各个试次使用光trigger进行同步,trigger标记在每个刺激开始时刻。
- 重点:采样率250Hz,每个被试有6个block,每个block有40个trial,脑电数据为二维数据(通道×采样点)
- 给刚刚处理好的数据做整合:
clear
clc
%% data processing
% load data
TrialTime = 6;
fs =250;
for name_i = 1:4
for block_i = 1:3
filename = ['F:\BCI\CCA+DW_Project\CompetitionData\','S',num2str(name_i),'\block',num2str(block_i),'.mat'];
load(filename)
labelIndex = find((data(9,:)>0 & data(9,:)<41));
for index = 1:40
eeg(:,:,index,block_i) = data(1:8 ,labelIndex(index):labelIndex(index)+ fs * TrialTime - 1 );
end
label(block_i,:) = data(9,labelIndex)
end
newfilename = ['F:\user\CompetitionData\','S',num2str(name_i),'\S',num2str(name_i),'.mat']
save(newfilename,'eeg','label')
end
以上我把一个被试的脑电数据(channel * point * trial * block)结合在了一个4-D的eeg矩阵里。
比如说我要区第一个block的数据,输入命令eeg(:,:,:,1)
即可得到ans为8150040的矩阵,如果再想用一个block里取第一个trial的数据,输入命令ans(:,:,1)
即可。
也可以一步到位eeg(:,:,1,1)
,以此类推,取第三个block,第35个trial为eeg(:,:,35,1)
换句话说,第三维和第四维可以这么理解成一个二维矩阵: