# # Llamadas Matlab eeglab paquete de renderizado por lotes topología EEG

Uso topoplot función puede dibujar fácilmente el diagrama de topología en la figura MATLAB EEG, pero para las grandes cantidades de datos, si cada topología invocar manualmente topoplot hacer dibujos, va a consumir una gran cantidad de tiempo y esfuerzo, he aquí una secuencia de comandos de MATLAB leer la letra archivo de Excel tomada almacenada en los datos del lote y los instrumentos del dibujo por lotes .

1. La estructura de almacenamiento de la fuente de datos

archivo de Excel para la fuente de datos, los datos en el documento de Excel tema de la siguiente manera:
Aquí Insertar imagen Descripción

Los datos básicos se divide en tres partes: la columna de característica, y los electrodos de columna dot datos de la columna, en el que:

  1. Caracterizado porque la columna: representa una característica de datos,
  2. Dot electrodos de columna: electrodos punto indica la ubicación de los datos de medición
  3. Columnas: almacenar los datos de EEG intensidad

2. Introduzca los parámetros

Algoritmo comportamiento ante varios parámetros de entrada:

nombre del parámetro Descripción del parámetro
featurecol El archivo seleccionado característica de Excel enumerados en las columnas de la etiqueta (matriz)
datacol columnas de datos encabezado de la columna (Array)
loccol Electrodo en los datos de punto documento de Excel de índice de la columna (int)
boundlimitcol Esta columna de acuerdo con el paquete de datos y calcula los valores máximo y mínimo de cada grupo, cuando el dibujo se le asigna los mismos datos en el mismo grupo de límite pequeño (int)

3. Estructura de salida

Algoritmos basados ​​en el nombre del archivo de entrada de Excel, cree una carpeta con el mismo nombre (aquí se llama un directorio) en el directorio de archivo de origen; En esta carpeta, el algoritmo basado en el nombre de la columna de datos de la matriz, y continuar para crear el número de columnas de datos mismas carpetas con el nombre, (a que se refiere el presente documento como directorio secundario), y finalmente, el algoritmo en la pluralidad de directorio secundario, la generación de una topología de EEG correspondiente, mientras que el algoritmo "-" donde cada uno de la vinculación de datos ya que cada nombre de archivo de imagen. Árbol de la estructura del archivo de salida es el siguiente:

|--data.xlsx(源文件)
|--data(一级目录)
	|--------数据列1(二级目录)
		|---------------------文件1.png
		|---------------------文件1.png
		|---------------------文件1.png
		|...
		|---------------------文件n.png
	|--------数据列2(二级目录)
	...
...	

Algoritmo generaron disparos de imagen son los siguientes:

Aquí Insertar imagen Descripción

4. Código

Ejecutar este código tendrá topoplot, chanlocsposi.mat chanlocsseek dos funciones y otros documentos, archivo de enlace de descarga, descargar la versión V3.0 actualizado al comienzo del artículo, al principio del algoritmo!

clear all
clc
% filepath = uigetdir('*.*','请选择文件夹');%fliepath为文件夹路径</span>
featurecol=[1,3,4,5,6];     %特征列
datacol=7;          %数据列
loccol=2;            %电极点列
boundlimitcol=1;        %限制画图上下限的列标

%调用GUI界面选择文件
% [filename1,filepath1]=uigetfile('*.xlsx','打开文件');
% filepath=strcat(filepath1,filename1); 

filepath='源数据.xlsx';
[num,txt,raw]=xlsread(filepath);%读取xlsx文件
% size(raw)

%如果每列存在合并单元格的情况,则对空值进行填充
for i = 1:max([featurecol,loccol,datacol])
    temp=raw{2,i};
    for j = 2:size(raw,1)
        if isnan(raw{j,i})
            raw{j,i}=temp;
        else
            temp=raw{j,i};
        end
    end
end

%统计每个特征列值可能出现的值(读取每列数据并去重) ->colall
for i = 1:length(featurecol) 
    ii=featurecol(i);
    colall{i,1}=unique(raw(2:size(raw,1),ii));  
end

%根据boundlimitcol提供的列标,将所有数据中boundlimitcol列值相同的行划分为一组,
%计算每组的最大值和最小值,在后期绘图时相同组的数据使用相同的上小限。
alldatanum=ones(length(colall{boundlimitcol,1})*length(datacol),1);
for k1 = 2:size(raw,1)
    k1;
    for k2 =1:length(colall{boundlimitcol,1})
        k2;
        if(strcmp(raw{k1,boundlimitcol}(1,:),colall{boundlimitcol,1}(k2,:)))
           for ii =1:length(datacol)
               alldata(alldatanum(k2)+ii-1,k2) = raw{k1,datacol(ii)}(1,1);
               alldatanum(k2)=alldatanum(k2)+1;
           end
        end
    end
end
boundlow=min(alldata);
boundup=max(alldata);

%计算每列每个特征重复的次数
for i =1:length(colall)
    featurelen(i)=1;
    if i<length(colall)
        for ii =i+1:length(colall)
            featurelen(i)=featurelen(i)*length(colall{ii,1});
        end
    end
end

%遍历整个数据矩阵,穷举所有特征列可能出现的组合 ->dicttemp
for i =1:length(colall)
    if i==1
        circulatecount=1;
    else
        circulatecount=1;
        for t=1:i-1
            circulatecount=circulatecount*length(colall{t,1});
        end
    end
    for ii =1:length(colall{i,1})
        for iii=1:circulatecount
            startnum=1+(ii-1)*featurelen(i)+(iii-1)*length(colall{i,1})*featurelen(i);
            endunm=ii*featurelen(i)+(iii-1)*length(colall{i,1})*featurelen(i);
            dicttemp(startnum:endunm,i)=colall{i,1}(ii);
        end
    end
end

%生成每张图片保存所用的文件名,每张图片用到的数据,每张图片设定的上下线信息
loccolnum=length(unique(raw(2:size(raw,1),loccol)));  %电极点数目
for i =1:length(dicttemp) % dicttemp 条目
    i
    name='';
    for ii = 1:size(dicttemp,2)
        ii;
        name=[name,'-',dicttemp{i,ii}];
    end
    dict{i,1}=name;
    datavaluenum=1;
    datavalue=cell(loccolnum,1+length(datacol));
    for k1 = 2:size(raw,1)  % raw数据
        ismatch=1;
        for ii =1:length(featurecol)        % 所选特征数
            if ~(strcmp(raw{k1,featurecol(ii)}(1,:),dicttemp{i,ii}))
                ismatch=0;
                break;
            end    
        end
        if ismatch==1  %若raw的k1列特征和dicttemp当前列的特征相同,则将数据列的数据放入datavalue
            datavalue{datavaluenum,1}=raw{k1,loccol}(1,:);
            for iii =1:length(datacol)
                datavalue{datavaluenum,1+iii}=raw{k1,datacol(iii)}(1,:);
            end
            datavaluenum = datavaluenum+1;
        end
    end
    dict{i,2}=datavalue; %将所有符合dicttemp i列的数据返回给添加到dict矩阵中
    boundlimitcolpro=find(featurecol==boundlimitcol);%边界限制列内部下标
    boundindex=find(strcmp(colall{boundlimitcolpro,1},dicttemp(i,boundlimitcolpro)));%每条数据对应的上下限的索引
    for ii =1:length(datacol)%针对不同的数据列设置不同的上下限
       dict{i,3+(ii-1)*2}=boundlow(1,boundindex);
       dict{i,4+(ii-1)*2}=boundup(1,boundindex);
    end
end

filename=filepath(1:end-5);%删除文件名的后缀名

%创建一级目录
if exist(filename,'dir')==0
    mkdir(filename);
end

%创建二级目录
for i =1:length(datacol)
    if exist([filename,'/',raw{1,i}(1,:)],'dir')==0
        mkdir([filename,'/',raw{1,i}(1,:)]);
    end
end   

%调用topoplot画图
structloc=chanlocsseek(dict{1,2}(:,1));%将电极点位置数组转换成topoplot要求的矩阵结构
for i=1:length(dicttemp)
    for ii = 1:length(datacol)
        h_fig=figure('Visible', 'off');%
        %h_fig=figure('Visible', 'off');%显示每次绘制的图片
        axes = subplot(1,1,1);
        bound=[dict{i,3}(1,1),dict{i,4}(1,1)];
        topoplot(cell2mat(dict{i,2}(:,1+ii)),structloc,'maplimits',bound,'plotrad',0.6,'headrad',0.6,'gridscale',300)
        cbar(0,0,bound);%显示颜色bar
        saveas(h_fig, [filename,'/',raw{1,ii}(1,:),'/',(dict{i,1}),'-',raw{1,ii}(1,:),'.png']);%保存绘制的图片
        close(h_fig); %关闭图片资源
    end
end
Publicado 59 artículos originales · ganado elogios 2 · Vistas 4638

Supongo que te gusta

Origin blog.csdn.net/lch551218/article/details/103791448
Recomendado
Clasificación