Matlab和C/C++元胞数组cell相关操作总结

article/2025/10/24 2:41:16

元胞数组cell

  • 1 Matlab中元胞数组cell的操作
    • 1.1 数组与元胞数字相互转换:mat2cell、cell2mat
      • 1.1.1 mat2cell使用形式
        • 实例一:划分数组并以元胞数组形式返回子数组
        • 实例二:按行划分数组
      • 1.1.2 cell2mat使用形式
        • 实例一:将元胞数组转换为数值数组
        • 实例二:将struct元胞数组转换为struct数组
        • 实例三:将cell数组转换为struct数组
    • 1.2 元胞数组与表相互转换:cell2table、table2cell
      • 1.2.1 cell2table使用形式
        • 实例:将元胞数组按照指定变量名称转换成表
      • 1.2.2 table2cell使用形式
        • 实例:将表转换为元胞数组
    • 1.3 数组转换为相同大小的元胞数组:num2cell
      • 1.3.1 num2cell使用形式
        • 实例:将数组转换为元胞数组
  • 2 C/C++中元胞数组cell的操作(针对mat文件)
    • 2.1 相关函数
      • 2.1.1 打开mat文件:matOpen
      • 2.1.2 读取mat文件的变量:matGetVariable
      • 2.1.3 读取元胞中的数据:mxGetCell
      • 2.1.4 获取数据阵列中的数据:mxGetData
      • 2.1.5 获取数据阵列矩阵的维数:mxGetM、mxGetN
      • 2.1.6 创建数据阵列为双浮点数矩阵:mxCreateDoubleMatrix
      • 2.1.7 将变量存入数据阵列:mxSetData
      • 2.1.8 将数据阵列存入到mat文件中:matPutVariable
    • 2.2 基本处理步骤
  • 参考

1 Matlab中元胞数组cell的操作

利用reshape函数创建一个6*4数组:

A = reshape(1:20,5,4)'

注意:
reshape函数在使用过程中需要注意的是创建数组的维度要和原始的数量对应,不然会报一下错误:
在这里插入图片描述

在这里插入图片描述

1.1 数组与元胞数字相互转换:mat2cell、cell2mat

1.1.1 mat2cell使用形式

  • C = mat2cell(A,dim1Dist,...,dimNDist) 将数组 A 划分为更小的数组,并在元胞数组 C 中返回它们。向量 dim1Dist,…dimNDist 指定如何划分 A 的行、列和(如果适用)更高维度。C 中较小的数组可以具有不同大小。A 可以包含任何数据类型。
  • C = mat2cell(A,rowDist) 将数组 A 划分为一个 n×1 元胞数组 C,其中 n 等于 rowDist 中元素的数量。

例如,如果 A 是 60×50 数组,则可以将此参数指定为 [10 20 30],[25 25] 来划分 A,如下面的代码和图形所示。C 是元胞数组,其中包含从 A 中拆分出来的六个子数组。

C = mat2cell(A,[10 20 30],[25 25])

在这里插入图片描述

实例一:划分数组并以元胞数组形式返回子数组

将 A 划分为四个 2×3子数组。以元胞数组形式返回子数组。

C = mat2cell(A,[2 2],[3 3])

在这里插入图片描述

使用 celldisp 函数显示 C 中的子数组。

celldisp(C)

在这里插入图片描述

实例二:按行划分数组

划分 A 的行,以使元胞数组包含两个子数组。由于 rowDist 的第一个元素是 2,因此 C 的第一个元胞包含 A 的第一行。rowDist 的第二个元素是 3,因此 C 的下一个元胞包含 A 的接下来的三行。rowDist 的元素总和等于 A 的行数。

rowDist = [1 3];
C = mat2cell(A,rowDist)

在这里插入图片描述
同样使用celldisp函数显示子数组

celldisp(C)

在这里插入图片描述

1.1.2 cell2mat使用形式

A = cell2mat(C) 将元胞数组转换为普通数组。元胞数组的元素必须全都包括相同的数据类型,并且生成的数组也是该数据类型。

例如,同一列中的元胞的内容必须具有相同的列数,但不需要具有相同的行数:
在这里插入图片描述

实例一:将元胞数组转换为数值数组

将一个元胞数组的六个元胞中的数值数组转换为一个数值数组。

C = {[1 7], [2 3 4],[12];[13 11 ; 12 23], [6 7 8; 10 11 12],[18;24]}

在这里插入图片描述

A = cell2mat(C)

在这里插入图片描述

实例二:将struct元胞数组转换为struct数组

a.id = [12 3 8];
a.name = 'X';
b.id = [20 22 24];
b.name = 'h';
c = {a,b};
d = cell2mat(c)

c是元胞数组
在这里插入图片描述

d是结构体数组
在这里插入图片描述

实例三:将cell数组转换为struct数组

n=3;
%% 初始化一个cell数组
c_info=cell(n,1);
id=[12 3 8];name={'x','l','h'};
age=[20 22 24];
for i=1:n;c_info{i}.id=id(i);c_info{i}.name=name{i};c_info{i}.age=age(i);
end
%% 转化代码
cs_info=[c_info{:}]

在这里插入图片描述
cs_info为结构体数组:
在这里插入图片描述
cs_info(1,1)的值:
在这里插入图片描述
cs_info(1,2)的值:
在这里插入图片描述
cs_info(1,3)的值:
在这里插入图片描述

1.2 元胞数组与表相互转换:cell2table、table2cell

1.2.1 cell2table使用形式

  • T = cell2table(C)将 m×n 元胞数组 C 的内容转换为 m×n 表 T。C 的每一列提供 T 的一个变量中包含的数据。
  • T = cell2table(C,Name,Value) 通过由一个或多个 Name,Value 对组参数指定的其他选项基于元胞数组 C 创建表。

实例:将元胞数组按照指定变量名称转换成表

首先创建一个包含字符向量和数值数据的元胞数组C:

C = {1 'matlab' 2 'A'; 2 'python' 3 'A+';...3 'C++' 4 'A++'; 5 'java' 6 'A-'}

在这里插入图片描述
在这里插入图片描述
然后将元胞数组 C 转换按照指定变量名称转换成表。

T = cell2table(C,'VariableNames',{'id1' 'course' 'id2' 'grade'})

特别需要注意的是:将元胞数组转成表只能在matlab 2015版本以上,低于2013的没有cell2table这个函数
博主的matlab是R2013a的,所以在应用cell2table时报一下错误:
在这里插入图片描述
意思就是:未定义函数’cell2table’作为类型为’cell’的输入参数。

正常运行结果:

T=4×4 tableid1    	  course         id2            grade___    ____________    ________    ______________1     {'matlab' }        2           {'A'}    2     {'python'  }       3           {'A+'}    3     {'C++' }       	  4           {'A++'}    5     {'java'}           6           {'A-' }    

1.2.2 table2cell使用形式

C = table2cell(T) 将表 T 转换为元胞数组 C。T 中的每个变量都会成为 C 中的元胞列。

实例:将表转换为元胞数组

创建一个表 T:

T = table(categorical({'M';'M';'F';'F';'F'}),[22;24;21;20;23],...[119 95;121 78; 125 86; 120 85; 122 90],...'VariableNames',{'Gender' 'Age' 'BloodPressure'},...'RowNames',{'Smith' 'Johnson' 'Williams' 'Jones' 'Brown'})

将 T 转换为元胞数组。

C = table2cell(T)
C=5×3 cell array{[M]}    {[22]}    {1x2 double}{[M]}    {[24]}    {1x2 double}{[F]}    {[21]}    {1x2 double}{[F]}    {[20]}    {1x2 double}{[F]}    {[23]}    {1x2 double}

1.3 数组转换为相同大小的元胞数组:num2cell

1.3.1 num2cell使用形式

  • C = num2cell(A) 通过将 A 的每个元素放置于 C 的一个单独元胞中,来将数组 A 转换为元胞数组 C。
  • C = num2cell(A,dim) 将 A 的内容划分成 C 中单独的元胞,其中 dim 指定每个元胞包含 A 的哪个维度。dim 可以是维度的标量或向量。

当dim=1,2,[1 2]时:
num2cell(A,1) 创建一个 1×3 元胞数组 C,其中每个元胞包含 A 的 2×1 列。
num2cell(A,2) 创建一个 2×1 元胞数组 C,其中每个元胞包含 A 的 1×3 行。
num2cell(A,[1 2]) 创建一个 1×1 元胞数组 C,其中每个元胞包含 A 整个数组。

实例:将数组转换为元胞数组

利用magic函数创建4*4的数值:

a = magic(4)

在这里插入图片描述
将其转化为元胞数组:

c = num2cell(a)

在这里插入图片描述

2 C/C++中元胞数组cell的操作(针对mat文件)

注意,针对mat文件操作之前需要加载头文件:#include "mat.h"

2.1 相关函数

2.1.1 打开mat文件:matOpen

MATFile *matOpen(const char *filename,const char *mode)

输入的mode有一下几种形式:

  • r:以只读方式打开
  • u:更新模式,可读可写,但是如果要打开的数据文件不存在,也不会创建新的文件
  • w:以写入方式打开,只能写入,如果要打开的数据文件不存在,则创建一个新的文件

2.1.2 读取mat文件的变量:matGetVariable

mxArray * matGetVariable(MATFile * pMF, const char * name);

读取名为name的变量,返回一个数据阵列指针

2.1.3 读取元胞中的数据:mxGetCell

C/C++中也有一个针对mat数据中的cell操作函数:

EXTERN_C mxArray *mxGetCell(const mxArray *pa, mwIndex i);

输入:

  • pa:指向mxArray类型的指针;
  • i:元胞中元素的标号;按列优先。

输出:

  • 指向mxArray类型的指针。

2.1.4 获取数据阵列中的数据:mxGetData

void *mxGetData(const mxArray *pa );

返回时需要使用强制类型转换。

2.1.5 获取数据阵列矩阵的维数:mxGetM、mxGetN

size_t mxGetM(const mxArray *pa);// 获取矩阵pa的行数
size_t mxGetN(const mxArray *pa);//获取矩阵pa的列数

2.1.6 创建数据阵列为双浮点数矩阵:mxCreateDoubleMatrix

mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity flag);

2.1.7 将变量存入数据阵列:mxSetData

void mxSetData( mxArray *pa, void  *newdata );

2.1.8 将数据阵列存入到mat文件中:matPutVariable

int matPutVariable(MATFile * pMF, const char * name, const mxArray * pA);

存入成功返回0,存入出错返回非0

2.2 基本处理步骤

变量定义及初始化

 	MATFile *pmat;		//指向mat文件的指针const char **dir;	//元素名列表const char *file;	//mat文件名int         ndir;	//mat文件中的元素(矩阵、元胞)个数mxArray *cell1;		//指向要读取的元胞数据的指针mxArray *mat1;		//指向元胞中某个元素的指针double *a;			//指向元胞中某个元素第一个数据的指针

首先打开mat文件

pmatFile= matOpen("data.mat", "r");//打开文件,返回指向mat数据指针if (pmatFile == NULL){printf("打开mat文件失败!");return 0;}

然后读取mat文件中的矩阵列表(返回mat中包含的元素的名字)

dir = (const char **)matGetDir(pmatFile, &ndir);if (dir == NULL){printf("读取mat文件失败!");return 0;}   

接着,从打开的mat文件中读取名字为dir[0]的元胞,返回指向该矩阵的指针

注意:MATLAB中的矩阵是按列优先存储

cell1 = matGetVariable(pmatFile,dir[0]);//指向名字为dir[0]的元胞

再获取元胞的行数和列数

int cellM = (int)mxGetM(cell1);//获取元胞的行数
int cellN = (int)mxGetN(cell1);//获取元胞的列数

最后按列有限依次读取元胞中的数据

 for(int count=0;count<cellM*cellM;count++){mat1 = mxGetCell(cell1,count);//按列优先,指向元胞中的第count+1个元素a = (double*)mxGetData(mat1);//指向mat1中的第一个数据M = (int)mxGetM(mat1);//获取mat1的行数N = (int)mxGetN(mat1);//获取mat1的列数printf("元素%d的维数为:(%d,%d)\n",count,M,N);for (int i=0;i<M;i++){for (int j=0;j<N;j++)printf("%f ",a[j*M+i]);printf("\n");}}

参考

  • https://ww2.mathworks.cn/help/matlab/ref/struct2cell.html
  • https://blog.csdn.net/jnulzl/article/details/49623121
  • https://blog.csdn.net/left_la/article/details/8206645

要不先来个一键三连,以表谢意


http://chatgpt.dhexx.cn/article/dpv52Nba.shtml

相关文章

Windows访问Macbook共享文件夹

1.条件&#xff1a;macbook与windows在同一局域网内 2.设置MacBook共享文件夹 (1).左上角系统偏好设置 (2)点击文件共享 (3).选择共享文件目录 (4).选择该目录使用的用户 (5).设置共享权限权限 3.windows访问共享文件&#xff1a; (1).winr (2).输入:192.168.0.100是MacB…

win11本机和虚拟机共享文件夹

本来想在本机win11系统上装一个Oracle数据库&#xff0c;可是一直停在数据库安装向导进不去&#xff0c;果断选择在虚拟机中装一个win10试试是不是win11系统的问题&#xff0c;在装完系统之后发现&#xff0c;win10的本机和虚拟机共享1文件夹的方式和之前不一样&#xff0c;然后…

VirtualBox 共享文件夹 挂载点设置

step 1 主机设置 选中虚拟机->设置->共享文件夹&#xff0c;做如下设置&#xff1a; 建议选中“自动挂载”和“固定分配”。 step 2 虚机设置 step 1设置好后&#xff0c;打开虚机&#xff0c;进入文件浏览器&#xff0c;即可看到挂载的目录&#xff1a; 同时&#xff0…

Mac 共享文件夹

1. Go to System Preferences -> Sharing 2. 勾选左边栏 File Sharing, 选择要共享的文件夹&#xff0c;用户以及用户权限 3. 点击 Option,选择用户,点击Done 转载于:https://www.cnblogs.com/chou-er/p/6795062.html

windows10 访问 Mac 共享文件夹

起初想要用 mac 访问windows的共享文件夹&#xff0c;但是连不通。网上的资料良莠不齐&#xff0c;踩了很多坑&#xff0c;最后发现是windows机器没有本地共享安全策略&#xff0c;因为我的电脑是windows10 家庭版。 所以想办法共享 mac 中的文件给 windows 机器。 在这里记录…

服务器上文件夹没有共享,服务器没有共享文件夹

服务器没有共享文件夹 内容精选 换一换 本节操作介绍本地MacOS系统主机通过安装“Microsoft Remote Desktop for Mac”工具向Windows云服务器传输文件的操作步骤。本地主机已安装Microsoft Remote Desktop for Mac或其他Mac OS系统适用的远程连接工具。下载Microsoft Remote De…

Mac访问共享文件夹

这里以我要访问一台 Windows 电脑上的一个 AirPlay 文件夹为例&#xff0c;从下图中可以看到已经共享了此目录。 先在 Mac 系统中打开 Finder 应用&#xff0c;如图所示 打开 Finder 窗口以后&#xff0c;请按键盘上的 commandK 组合键&#xff0c;如图所示 随后我们在框框中输…

苹果系统 怎么找到共享计算机,Mac电脑怎么访问共享文件夹

如果你是一位Mac电脑用户&#xff0c;想要访问身边的Windows 系统共享&#xff0c;应该怎么操作呢?这里学习啦小编简单介绍下操作方法。 Mac电脑访问共享文件夹的方法 这里以我要访问一台 Windows 电脑上的一个 AirPlay 文件夹为例&#xff0c;从下图中可以看到已经共享了此目…

mac连接服务器共享文件夹,教大家Mac访问Windows共享文件夹的方法

今天小编来给大家针对这个教大家Mac访问Windows共享文件夹的方法的问题来进行一个介绍&#xff0c;毕竟当下也是有诸多的小伙伴对于教大家Mac访问Windows共享文件夹的方法这个问题非常的重视的&#xff0c;下面大家可以看下具体的详情 第一步&#xff1a;在先Windows中新建文件…

vm用c语言进入共享文件夹,如何在Vmware虚拟机中访问MAC共享文件夹

我们有时需要在MAC电脑上完成一些Windows系统中才能做的事&#xff0c;但是用户们又不想安装Windows系统&#xff0c;因此&#xff0c;安装Vmware虚拟机就成为了这类用户们的最佳选择。不过我们怎么才能在Vmware虚拟机中访问MAC共享文件夹呢&#xff1f; 具体操作步骤&#xff…

mac怎么访问服务器文件夹,Mac OS X共享文件夹的访问

设置好Mac系统的文件共享功能后&#xff0c;同一网段的计算机就可以通过局域网访问此Mac系统了。下面&#xff0c;分别介绍如何通过Mac系统与Windows系统访问Mac电脑中的共享文件夹。 一、Mac系统访问Mac共享文件夹 1. 通过“前往”>“网络”命令访问局域网中的Mac电脑 首先…

mac操作系统如何访问共享计算机,windows电脑怎么访问苹果电脑共享文件夹

在一个局域网之中&#xff0c;我们可以通过设置共享的方法&#xff0c;让其他电脑来访问本机共享文件夹&#xff0c;从而实现数据快速传输。那么windows电脑怎么访问苹果电脑的共享文件夹呢&#xff1f;下面就跟小编一起来学习下windows系统访问mac系统共享文件步骤。 一、所需…

Mac VMware Fusion设置共享文件夹

我们首先点击小扳手按钮&#xff0c;接着点击共享按钮。 根据自身情况配置一个共享文件夹 在mnt/目录下创建一个名为 hgfs的目录&#xff08;记得创建目录&#xff0c;否则会报错&#xff09;。

mac共享文件android,Mac如何访问安卓系统共享文件夹的方法

Mac系统与安卓系统的差异导致了很多网友都无法完成两个系统间互相访问共享文件夹的操作&#xff0c;对办公等造成了很多的困扰&#xff0c;那么到底Mac系统如何访问WIN系统的共享文件夹呢?今天学习啦小编就为大家带来了Mac如何访问安卓系统共享文件夹的解决方法&#xff0c;希…

ubuntu服务器创建共享文件夹,ubuntu共享文件夹

ubuntu共享文件夹 内容精选 换一换 NFS(NetworkFileSystem)即网络文件系统&#xff0c;是FreeBSD支持的文件系统中的一种&#xff0c;它允许网络中的计算机之间共享资源。在NFS的应用中&#xff0c;本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件&#xff0c;就像…

mac文件共享连不上服务器,mac服务器文件夹共享权限设置

mac服务器文件夹共享权限设置 内容精选 换一换 该任务指导用户使用Loader将数据从SFTP服务器导入到Hive。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业中指定的Hive表的权限。获取SFTP服务器使用的用户和密码&#xff0c;且该用户具备SFTP服务器…

mac登录共享文件夹服务器,Mac如何访问Windows共享文件夹

苹果Mac OS X与Windows是两个不同的操作系统&#xff0c;那么Mac如何访问Windows共享文件夹呢?就让学习啦小编来告诉大家Mac访问Windows共享文件夹的方法吧&#xff0c;希望可以帮助到大家。 Mac访问Windows共享文件夹方法 第一步&#xff1a;在先Windows中新建文件夹e:\iOS&a…

Mac共享文件夹

转载自&#xff1a;http://jingyan.baidu.com/article/48206aeafd122a216bd6b34b.html Mac如何共享文件夹 | 浏览&#xff1a;5975 | 更新&#xff1a;2014-07-30 22:32 1 2 3 4 5 6 7 分步阅读 使用 Mac 电脑的小伙伴难免会与身边的朋友要通过网络共享一些数据资源&#xff0c…

windows共享文件夹给mac

一、Windows &#xff1a; windows建立个共享文件夹。文件夹右键——属性——共享——高级共享。权限给到最大&#xff08;读写&#xff09;。 【高级共享】这里打勾&#xff1a; 【共享】这里设置访问权限&#xff1a; 命令行打印&#xff1a;ipconfig 查看网路 IP 二、Mac …

Win10 局域网内与Mac共享文件夹

win10 64bit MacOS Monterey 12.6.1 Win10设置 控制面板里打开共享 新建一个共享文件夹&#xff0c;右键属性设置共享 关闭防火墙 Mac设置 打开共享设置&#xff1a;系统偏好设置 > 共享 打开访达 > 前往 > 链接服务器&#xff0c;格式&#xff1a;smb://目标电脑…