matlab 四维矩阵如何理解(脑电信号分析)

  1. 首先创建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];
  1. 给data矩阵(4-D)赋值a,b
data(:,:,1,1) = a;
data(:,:,2,1) = b;

此时在变量里看到data是一个2×2×2矩阵,其中(1,1)位置放的是a矩阵,(2,1)放的是b矩阵

  1. 将data矩阵变成4维
data(:,:,1,2) = c;

此时可以发现,当把c矩阵赋值给data(:,:,1,2)的位置时,data就变成了4-D

接下来把矩阵d复制到data(:,:,2,2)的位置

data(:,:,2,2) = d;

此时矩阵data中的位置分布如下:
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反馈如下:
在这里插入图片描述
即我们以上的结论是正确的。

  1. 有了正确的理解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标记在每个刺激开始时刻。

  1. 重点:采样率250Hz,每个被试有6个block,每个block有40个trial,脑电数据为二维数据(通道×采样点)
  2. 给刚刚处理好的数据做整合:
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)

换句话说,第三维和第四维可以这么理解成一个二维矩阵:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脑电信号要分类

你的鼓励是我创作的前进动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值