如何提取出cell中具体数据 matlab

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何提取出cell中具体数据 matlab相关的知识,希望对你有一定的参考价值。

以上为一个289乘1的cell
其实每一个元素都是一个矩阵(如(1,1))
我现在想要将这289个矩阵内元素提取后对应相加,请问如何处理

直接对cell进行操作,不用提取。你这是个289*1的cell,每个cell里有182*24个元素,假设cell的名字叫a,你要提取第一行那个矩阵里的第一行,第一列的元素。使用a1,1(1,1)就可以了,以此类推都是一样的。

参考技术A 直接对cell进行操作,不用提取。你这是个289*1的cell,每个cell里有182*24个元素,假设cell的名字叫a,你要提取第一行那个矩阵里的第一行,第一列的元素。使用a1,1(1,1)就可以了,以此类推都是一样的。 参考技术B Cell是Matlab中的一种数据类型,概念和结构类似。用大括号定义,括号里可以是任意类型的数据或矩阵。

关于cell的创建:
1.跟一般创建矩阵一样,直接使用C = A B D E这种形式,不过这里把"[]“改成了”"

2.使用cell创建cell,C= C1 C2,这里C1和C2都是cell类型,直接把C1 C2作为一个cell得到的C3是一个1x2的cell数组;使用C3 = [C1 C2],是使用C1和C2的内容来创建cell数组

3.使用cell函数,A=cell(2,2),创建一个空的2x2的cell矩阵.

关于cell的访问:
1.X= C(s)使用这种"()“形式的返回的是cell类
2.X = Cs使用这种”"形式的返回的是cell中的内容
3.其他的基本上与通常的数组.矩阵访问一样了
4.A1,1(2,3:end)访问的是A中的第一个cell里面内容的第2行的第三个元素以后的所有元素
5.A1,3.name访问的是A中的A1,3cell里面结构的name值
6.cell的图形化显示使用命令cellplot(A)即可如B=[1;2],这就定义了一个cell型的变量B,里面保存的是一个矩阵[1;2],要引用里面的数据只要在大括号里写上对应的下标即可,如B1。

下面我们给B再加个元素,我们可以这样定义B(2)=‘hello’。也可以利用引用的方法定义B2=’hello’。第二种方法比第一种方法更方便所以更常用。

这样B就有两个元素了,B(1)是[1;2],B(2)是‘hello’,每个元素都是cell型的
  (注意和B1、B2的区别,B1是[1;2],B2是’hello’
参考技术C

% 前提:1.Nfs3为 dd*1 的元胞数组;

%       2.元胞数组的元素行列相等;

% R 为对应元素的总和


dd = length(Nfs3);
[mm,nn] = size(Nfs31,1);
R = zeros(mm,nn);
for k = 1:dd
    R = R+Nfs3k,1;
end;
disp(R)

本回答被提问者和网友采纳

MATLAB | 如何从热图中提取数据

这期做了个可能有用的小工具,一般论文中热图很少给出数据,于是就想写个小工具通过热图上的颜色估计出数据值来,目前写了个初版的工具分享给大家!

工具函数

由于只是初版,要手动改的地方还是不少的,要设置好要提取数据的图片地址,结果存储地址,数据热图行数、列数以及colorbar的范围。

function getHeatmapData
% 要提取的图像地址
picPath='1.png';
% 提取结果存储路径
HMPath='data1.mat';
% 热图行数、列数
heatMapSize=[8,8];
% colorbar所表示范围
climColorbar=[-1,1];
% 提取colorbar上颜色点数量
pntNumColorBar=20;
% 数据计算所用点数(数值越大越精确)
pntNumInterp=1000;



% figure窗口初始化
pic=imread(picPath);
figure()
ax=gca;hold on
ax.XLim=[0,size(pic,2)];
ax.YLim=[0,size(pic,1)];
imshow(pic)
% 绘制红蓝色点的句柄
baHdl=plot(ax,0,0,'b+','MarkerSize',12,'LineWidth',1.5);
rxHdl=plot(ax,0,0,'rx','MarkerSize',12,'LineWidth',1.5);
pntSet=zeros(0,2);
colorSet=zeros(4,3);
set(gcf,'WindowButtonDownFcn',@buttondown)

    function buttondown(~,~)
        xy=get(gca,'CurrentPoint');
        xp=xy(1,2);yp=xy(1,1);pos=[yp,xp];
        if strcmp(get(gcf,'SelectionType'),'normal')
            pntSet=[pntSet;pos];
        elseif size(pntSet,1)>0
            pntSet(end,:)=[];
        end
        pntSet=round(pntSet);
        pntSet(pntSet<1)=1;
        if size(pntSet,1)>4
            set(gcf,'WindowButtonDownFcn',[])
            saveColor();
            close all
        else
        % 标记采样点位置和数值
        baHdl.XData=pntSet(:,1);baHdl.YData=pntSet(:,2);
        rxHdl.XData=pntSet(:,1);rxHdl.YData=pntSet(:,2);
        delete(findobj('type','text'))
        for i=1:size(pntSet,1)
            colorSet(i,:)=[pic(pntSet(i,2),pntSet(i,1),1),...
                           pic(pntSet(i,2),pntSet(i,1),2),...
                           pic(pntSet(i,2),pntSet(i,1),3)];
            text(ax,pntSet(i,1),pntSet(i,2),['    ',num2str(i),':[',num2str(colorSet(i,1)),',',...
                 num2str(colorSet(i,2)),',',num2str(colorSet(i,3)),']'])
        end
        end
    end
    function saveColor(~,~)
        % 获取colorbar上颜色
        cbPntSet=pntSet(1:2,:);
        cbPntSetdiff=abs(cbPntSet(1,:)-cbPntSet(2,:));
        if cbPntSetdiff(1)>cbPntSetdiff(2)
            tPntSet=cbPntSet(1,1)+linspace(0,1,pntNumColorBar)'.*(cbPntSet(2,1)-cbPntSet(1,1));
            tPntSet=round(tPntSet);
            CMap=[pic(round((cbPntSet(1,2)+cbPntSet(2,2))/2),tPntSet,1)',...
            pic(round((cbPntSet(1,2)+cbPntSet(2,2))/2),tPntSet,2)',...
            pic(round((cbPntSet(1,2)+cbPntSet(2,2))/2),tPntSet,3)'];
        else
            tPntSet=cbPntSet(1,2)+linspace(0,1,pntNumColorBar)'.*(cbPntSet(2,2)-cbPntSet(1,2));
            tPntSet=round(tPntSet);
            CMap=[pic(tPntSet,round((cbPntSet(1,1)+cbPntSet(2,1))/2),1),...
            pic(tPntSet,round((cbPntSet(1,1)+cbPntSet(2,1))/2),2),...
            pic(tPntSet,round((cbPntSet(1,1)+cbPntSet(2,1))/2),3)];
        end
        CMap=double(CMap);
        % -----------------------------------------------------------------
        % 提取heatmap上颜色
        hmPntSet=pntSet(3:4,:);
        hmXLim=[min(hmPntSet(:,1)),max(hmPntSet(:,1))];
        hmYLim=[min(hmPntSet(:,2)),max(hmPntSet(:,2))];
        YList=linspace(hmYLim(1),hmYLim(2),heatMapSize(1));
        XList=linspace(hmXLim(1),hmXLim(2),heatMapSize(2));
        [XMesh,YMesh]=meshgrid(round(XList),round(YList));
        CMesh=zeros(heatMapSize);
        for i=1:heatMapSize(1)
            for j=1:heatMapSize(2)
                CMesh(i,j,1)=pic(YMesh(i,j),XMesh(i,j),1);
                CMesh(i,j,2)=pic(YMesh(i,j),XMesh(i,j),2);
                CMesh(i,j,3)=pic(YMesh(i,j),XMesh(i,j),3);
            end
        end
        % 计算heatmap数值范围
        CMesh=double(CMesh);
        t1=linspace(climColorbar(1),climColorbar(2),pntNumColorBar)';
        t2=linspace(climColorbar(1),climColorbar(2),pntNumInterp)';
        CMapInterp=[interp1(t1,CMap(:,1),t2,'linear'),interp1(t1,CMap(:,2),t2,'linear'),interp1(t1,CMap(:,3),t2,'linear')];
        Data=zeros(heatMapSize);
        for i=1:heatMapSize(1)
            for j=1:heatMapSize(2)
                tRGB=[CMesh(i,j,1),CMesh(i,j,2),CMesh(i,j,3)];
                tnorm2=sum((CMapInterp-tRGB).^2,2);
                [ind,~]=find(tnorm2==min(tnorm2),1);
                Data(i,j)=t2(ind);
            end
        end
        % 存储数值
%         timestr=char(datetime('now'));
%         timestr(timestr==' ')='_';
%         timestr(timestr==':')='_';
%         nowStr=[timestr,'.mat'];
        CMapInterp=CMapInterp./255;
        CMap=CMap./255;
        save(HMPath,'Data','CMap','CMapInterp','climColorbar')
    end
end

基本使用

假设有这么一张图(压缩包内提供的示例图7)

要提取的数据8行8列,colorbar范围-1到1,因此将工具函数最前面的代码做出如此改动:

% 要提取的图像地址
picPath='7.png';
% 提取结果存储路径
HMPath='data7.mat';
% 热图行数、列数
heatMapSize=[8,8];
% colorbar所表示范围
climColorbar=[-1,1];
% 提取colorbar上颜色点数量
pntNumColorBar=20;
% 数据计算所用点数(数值越大越精确)
pntNumInterp=1000;

依次点击colorbar最小值处,最大值处,以及热图的对角线两个点处,之后随便点击图片任意处(共点击五次),就能将数据存储在mat文件中:

大概这样取四个点,并随便点击图像某处(若是点错了可鼠标右键撤回):

之后查看mat文件:

其中:

  • Data 提取的热图数据
  • CMap colormap
  • CMapInterp 插值后colormap
  • climColor colorbar范围

获取了这些数据后,可以很轻松的靠以下代码复刻出来图像:

HM=load('data7.mat');
HMHdl=heatmap(HM.Data);
colormap(HM.CMapInterp)
% 新版本可以将caxis换为clim
caxis(HM.climColorbar)

% 不显示数值
HMHdl.CellLabelColor='none';

看起来提取的很完美,虽然肯定有误差,但是对于一般的论文复现已经足够了:


行列数不相同

几乎完全相同的处理手段,比如此图是15行20列,colorbar范围是-0.6到0.8,将最前面的代码修改为:

% 要提取的图像地址
picPath='6.png';
% 提取结果存储路径
HMPath='data6.mat';
% 热图行数、列数
heatMapSize=[15,20];
% colorbar所表示范围
climColorbar=[-.6,.8];
% 提取colorbar上颜色点数量
pntNumColorBar=20;
% 数据计算所用点数(数值越大越精确)
pntNumInterp=1000;

运行后进行取点:

之后还是运行绘图代码:

HM=load('data6.mat');
HMHdl=heatmap(HM.Data);
colormap(HM.CMapInterp)
% 新版本可以将caxis换为clim
caxis(HM.climColorbar)

% 不显示数值
HMHdl.CellLabelColor='none';

数据提取结果:


非方形色块热图

依旧依据热图性质修改一下参数:

% 要提取的图像地址
picPath='4.png';
% 提取结果存储路径
HMPath='data4.mat';
% 热图行数、列数
heatMapSize=[11,11];
% colorbar所表示范围
climColorbar=[-1,1];
% 提取colorbar上颜色点数量
pntNumColorBar=20;
% 数据计算所用点数(数值越大越精确)
pntNumInterp=1000;

这种圆点形状的尽量要取点时取在正中央

数据提取结果:


色块上有文本

依旧依据热图性质修改一下参数:

% 要提取的图像地址
picPath='8.png';
% 提取结果存储路径
HMPath='data8.mat';
% 热图行数、列数
heatMapSize=[8,8];
% colorbar所表示范围
climColorbar=[-1,1];
% 提取colorbar上颜色点数量
pntNumColorBar=20;
% 数据计算所用点数(数值越大越精确)
pntNumInterp=1000;

有文本的热图,在热图色块上点击时,尽量俩点点击在同一位置且不要碰到文字,比如俩色块都点击同一边角(下图所示即为点击两个色块左下角):

提取效果:


以上已给出完整代码,想要更多例子练练手:

【热图数据提取】

更新时会跟进更新以下连接:
【链接】:
https://pan.baidu.com/s/1zoStpQ54LqmR7fSXMWWyOA?pwd=slan

【提取码】:slan

以上是关于如何提取出cell中具体数据 matlab的主要内容,如果未能解决你的问题,请参考以下文章

Matlab如何导入mat文件并查看其中的数据

matlab如何提取矩阵中的每一列作为新的变量

matlab如何将一个cell转换成数值型或字符串型

matlab如何将一个cell转换成数值型或字符串型

如何用MAtlab把多行数据转化为一列

MATLAB | 赠书 | 如何从热图中提取数据