MATLAB的cell(元胞数组,又名元组)是个好东西---海纳百川的容器

cell(元胞数组,又名元组)最大的特点是其中的每个元胞都可以包含任意类型的数据,不仅数据类型是任意的,大小也是任意的。它就像一个海纳百川的容器。

这个是真好,因为有很多时候,我们事先并不知道我们要读取的数据的类型和长度,特别是长度,真得是很多情况下并不知道呢。

比如我们批量读取一批文件,每个文件都有文件名,我们要用一个二维字符串数组把名字存下来,但因为每个文件的文件名长度不一样,所以我们无法事先定义好二维字符串数组每个元素的长度。

再比如我们要批量读取一组图片,每个图片都有不同的宽高,我们也无法事先预先定义存储每一张图片的矩阵尺寸。

这个时候我们使用cell就可非常方便的解决以上两个问题了。

来看cell是如何解决上面的第一个问题的,即用一个变量存储多个文件的文件名。

示例代码如下:

[FileName,PathName,Indx]=uigetfile({'*.*','All Files (*.*)'},...
                                    'Open Video File','MultiSelect','on');

上面这段代码运行后,将弹出文件选取对话框,我们选取多个文件,那么程序将返回被选到的多个文件的文件名,并存储在变量FileName中,我们选择三个文件,如下图所示:

 

 

可见, 程序运处后,FileName为一个cell类型的数组,里面存储了三个不长度的字符串。

再来看cell是如何解决上面的第二个问题的,即用一个变量存储多幅不同尺寸的图像。

文件夹中有四张图片,如下图所示:

 它们的尺寸分别如下:

 ​​​​

 可见,四幅图的尺寸都不一样,这就导致我们没法预先定义一个确定大小的四维数组去存储以上四张图像。

此时,我们便可以用cell实现我们的这个需求,即用一个变量存储多幅不同尺寸的图像。

代码如下:

N=4;
img_group=cell(1,N);
for i=1:N  
    imName=strcat(num2str(i),'.jpg');
    img_group{i}=imread(imName);
end

for i=1:N
    imgName = strcat(num2str(i),'张图');
    imgName = strcat('第',imgName);
    figure,imshow(img_group{i});title(imgName);
end

运行结果如下:

 从以上运行结果我们可以看到,虽然四张图的尺寸不一样,但四张图被正确存储到了cell数组img_group中,并且可被正确引用。

而且,从上面这个示例我们还知道了如何访问cell数组的元素了,即用花括号(大括号)加索引,比如下面这条语句。

img_group{i}=imread(imName);

另外,有时我们需要存储不同类型的元素,也可用cell。

比如下面的代码:

N=5;
cell_group=cell(1,N);

k1=int8(-5);
k2=uint16(88);
k3=single(567.3);
k4=double(999.3563);
k5='i love you';

cell_group{1}=k1;
cell_group{2}=k2;
cell_group{3}=k3;
cell_group{4}=k4;
cell_group{5}=k5;

运行结果如下图所示:

 

<think> 我们正在讨论数组Cell Array)的概念。在MATLAB中,数组是一种特殊的数据类型,可以包含不同类型和大小的数据。在Python中,没有直接对应的“数组”类型,但是我们可以用其他数据结构来实现类似的功能。 在Python中,我们可以使用列表(list)来模拟数组,因为列表可以包含不同类型的素,包括数字、字符串、列表、字典等。另外,我们也可以使用元组(tuple)或字典(dict)等数据结构,但列表是最常用且灵活的。 此外,如果需要更复杂的结构,可以考虑使用NumPy库中的结构化数组(structured array)或者使用Python标准库中的数组(array)模块(但注意数组模块要求素类型相同,因此不适用于模拟数组)。 因此,实现数组最直接的方法是使用Python的列表。 示例: 创建一个类似数组的列表: cell_array = [1, 'a', [1,2,3], {'key': 'value'}] 这样,cell_array就是一个包含整数、字符串、列表和字典的列表,类似于MATLAB数组。 另外,如果我们需要类似MATLAB中的多维数组,我们可以使用嵌套列表。 例如,创建一个2x2的数组cell_array_2d = [[1, 'a'], [ [1,2,3], {'key': 'value'} ]] 但是注意,在MATLAB中,数组是矩阵形式的,每个素可以是任意类型,但在Python中嵌套列表每一行可以有不同数量的素(锯齿状),但我们可以通过固定嵌套列表的大小来模拟矩阵形式。 如果需要进行数值计算且数据主要是数值类型,使用NumPy数组可能更高效。但如果数据类型各异,列表是最佳选择。 因此,总结如下: 1. 使用列表(list)可以创建类似数组的结构,支持混合类型。 2. 使用嵌套列表可以实现多维数组。 参考示例代码: ```python # 创建一个一维数组(列表) cell_array_1d = [1, 'hello', 3.14, [1, 2, 3]] # 创建一个二维数组(嵌套列表) cell_array_2d = [[1, 'a'], [3.14, [1,2,3]], ['b', {'name': 'Alice'}]] # 访问素 print(cell_array_1d[0]) # 输出: 1 print(cell_array_2d[1][1]) # 输出: [1, 2, 3] ``` 另外,如果我们需要更接近MATLAB数组操作,例如对每个素应用函数,我们可以使用循环或列表推导式。 注意:在Python中,我们通常不需要特别强调“数组”这个概念,因为Python的列表本身就可以包含不同类型的素,这已经是Python的基本特性。 因此,我们可以直接使用列表来实现数组的功能。 如果用户之前使用的是MATLAB,现在转向Python,那么使用列表来替代数组是一个常见的做法。 相关问题: 1. 在Python中如何创建多维的数组? 2. 如何访问数组中的素? 3. 在Python中,数组与列表有何区别?(注意:在Python中,我们就是用列表来实现数组的,所以没有本质区别,只是概念上的对应) 4. 如何对数组的每个素进行操作? 根据以上分析,我们可以回答用户的问题:Python中实现数组的方法是使用列表(list)或嵌套列表。 我们也可以提到,如果需要进行更复杂的数值计算,特别是当数据主要是同质的时候,可以考虑使用NumPy数组。但对于混合类型,列表是最直接的。 因此,回答如下: </think> 在Python中,没有直接的"数组"类型(这是MATLAB中的概念),但可以通过以下两种主要方式实现类似功能: ### 1. 使用Python列表(List) Python列表天然支持存储不同类型的数据素,可以模拟数组的功能: ```python # 创建数组(列表) cell_array = [ 42, # 整数 "Python", # 字符串 [1, 2, 3], # 子列表 {"key": "value"}, # 字典 (4, 5, 6), # 元组 lambda x: x**2, # 函数 None # 空值 ] # 访问素 print(cell_array[0]) # 输出: 42 print(cell_array[2][1]) # 输出: 2 print(cell_array[5](3)) # 输出: 9(调用函数) ``` ### 2. 使用NumPy对象数组 对于需要数值计算优化的场景,可使用NumPy的对象数组: ```python import numpy as np # 创建对象数组 cell_array_np = np.array([ 3.14, "NumPy", [7, 8, 9], {"a": 1, "b": 2}, True ], dtype=object) # 访问和操作 print(cell_array_np[1]) # 输出: 'NumPy' cell_array_np[2].append(10) # 修改子列表 print(cell_array_np[2]) # 输出: [7, 8, 9, 10] ``` ### 关键区别说明 | 特性 | Python列表 | NumPy对象数组 | |--------------------|------------------------|---------------------| | 数据类型 | 天然支持混合类型 | 需显式声明`dtype=object` | | 性能 | 通用灵活 | 数值操作优化 | | 内存存储 | 非连续内存 | 连续内存块 | | 数学运算支持 | 需手动实现 | 支持向量化操作 | **推荐场景**: - 通用场景:Python列表(简洁灵活) - 科学计算:NumPy对象数组(性能更好) ### 实际应用示例 ```python # 模拟MATLABcell数组操作 matrix_cell = [ ["A1", [1, 2]], [np.eye(3), {"data": 100}] ] # 访问嵌套素 print(matrix_cell[0][1][0]) # 输出: 1 print(matrix_cell[1][0][2,2])# 输出: 1.0(单位矩阵素) ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

昊虹AI笔记

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值