matlab中的元胞数组如何实现批量的赋值呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab中的元胞数组如何实现批量的赋值呢?相关的知识,希望对你有一定的参考价值。

比方说,A='1','abc','NAN','11111','NAN',现在我想直接把NAN用其他数一次性替换掉,怎么去实现呢?不要循环哦

参考技术A

参考技术B 元胞数组是MATLAB的一种特殊数据类型,可以将元胞数组看做一种无所不包的通用矩阵,或者叫做广义矩阵。组成元胞数组的元素可以是任何一种数据类型的 常数或者常量,每一个元素也可以具有不同的尺寸和内存占用空间,每一个元素的内容也可以完全不同,所以元胞数组的元素叫做元胞(cell)。和一般的数值 矩阵一样,元胞数组的内存空间也是动态分配的。
(1)元胞数组的创建

>> a='matlab',20;ones(2,3),1:10
a =
'matlab' [ 20]
[2x3 double] [1x10 double]
>> b=['matlab',20;ones(2,3),1:10]
b =
'matlab' [ 20]
[2x3 double] [1x10 double]
>> c=10
c =
[10]
>> c(1,2)=2
c =
[10] [2]
>> c(2,2)=5
c =
[10] [2]
[] [5]
>> isequal(a,b)
ans =
1
>> whos
Name Size Bytes Class Attributes
a 2x2 388 cell
ans 1x1 1 logical
b 2x2 388 cell
c 2x2 208 cell
用cell函数创建元胞数组,创建的数组为空元胞。cell函数创建空元胞数组的主要目的是为数组预先分配连续的存储空间,节约内存占用,提高执行效率。
>> a=cell(1)
a =
[]
>> b=cell(1,2)
b =
[] []
>> c=cell(3,3)
c =
[] [] []
[] [] []
[] [] []
>> d=cell(2,2,2)
d(:,:,1) =
[] []
[] []

d(:,:,2) =
[] []
[] []
>> whos
Name Size Bytes Class Attributes
a 1x1 4 cell
ans 1x1 1 logical
b 1x2 8 cell
c 3x3 36 cell
d 2x2x2 32 cell
(2)元胞数组的数据获得
从元胞数组中读取数据,可保存为一个标准的数组或一个新的单元数组,或取出数组进行计算。元胞数组中数据的访问,可通过元胞内容的下标进行,用元胞数组名加大括号。大括号中数值表示元胞的下标。如a1,2表示元胞数组中第一行第二列的元胞。

>> a=20,'matlab';ones(2,3),1:3
a =
[ 20] 'matlab'
[2x3 double] [1x3 double]
>> str=a(1,2)
str =
'matlab'
>> class(str)
ans =
cell
>> str=a1,2
str =
matlab
>> class(str)
ans =
char
()和有着本质的区别,大括号用于表示元胞的内容,小括号表示指定的元胞。

a =
[ 20] 'matlab'
[2x3 double] [1x3 double]
>> a2,1(2,2)
ans =
0.9134
>> a2,1(2,3)
ans =
0.0975
>> a1,2(2)
ans =
a
使用元胞的下标,可将一个元胞数组的子集赋值给另一个变量,创建新的元胞数组。
>> a=[1,2,3;4,5,6;7,8,9]
a =
[1] [2] [3]
[4] [5] [6]
[7] [8] [9]
>> b=a(2:3,2:3)
b =
[5] [6]
[8] [9]
>> c=a(1:3,2:3)
c =
[2] [3]
[5] [6]
[8] [9]
本例使用元胞下标的方式创建了新的元胞数组b和c,通过结果看出b和c就是元胞数组a的一部分。
(3)元胞数组的删除和重塑
要删除单元数组中的行或列,可以用冒号表示单元数组中的行或列,然后对其赋一个空矩阵即可。

a=20,'matlab';ones(2,3),1:3
a =
[ 20] 'matlab'
[2x3 double] [1x3 double]
>> a(1,:)=[]
a =
[2x3 double] [1x3 double]
>> a=20,'matlab';ones(2,3),1:3;
>> a1=[]
a =
[] 'matlab'
[2x3 double] [1x3 double]
>> a(1)=[]
a =
[2x3 double] 'matlab' [1x3 double]
>> a(2)=[]
a =
[2x3 double] [1x3 double]
>> a(1,2)=[]
??? A null assignment can have only one non-colon index.
>> a(1)=[]
a =
[1x3 double]
元宝数组和其他数组一样,也可以通过reshape函数改变形状,改变后的元胞数组与原元胞数组的元素个数相同,不能通过改变形状来添加或删除元胞数组中的元素。

>> a=cell(4,4)
a =
[] [] [] []
[] [] [] []
[] [] [] []
[] [] [] []
>> size(a)
ans =
4 4
>> b=reshape(a,2,8)
b =
[] [] [] [] [] [] [] []
[] [] [] [] [] [] [] []
>> size(b)
ans =
2 8

(5)元胞数组中的操作函数
cell:创建空的元胞数组
cellfun:为元胞数组的每个元胞执行指定的函数
celldisp:显示所有元胞的内容
cellplot:利用图形方式显示元胞数组
cell2mat:将元胞数组转变成为普通的矩阵
mat2cell:将数值矩阵转变成为元胞数组
num2cell:将数值数组转变成为元胞数组
deal:将输入参数赋值给输出
cell2struct:将元胞数组转变成为结构
struct2cell:将结构转变为元胞数组
iscell:判断输入是否为元胞数组

MATLAB:任意数量的元胞数组的组合

【中文标题】MATLAB:任意数量的元胞数组的组合【英文标题】:MATLAB: Combinations of an arbitrary number of cell arrays 【发布时间】:2012-01-19 12:10:21 【问题描述】:

MATLAB 中是否有命令或单行策略将返回 n 单元数组的所有组件组合,一次采用 n

我想要完成的一个例子:

A = 'a1','a2';
B = 'b1','b2','b3';
C = combinations(A,B)
C = 'a1','b1' ;
     'a1','b2' ;
     'a1','b3' ;
     'a2','b1' ;
     'a2','b2' ;
     ... 

该命令将能够接受任意数量的参数,并且示例中的结果将具有与函数参数一样多的列。 (当然,上面的语法只是为了说明和任何可以生成结果的方法,无论格式是否符合要求)

编辑:针对矩阵而不是单元格提出了类似的问题,例如link。许多解决方案都指向 FEX 提交 allcomb,但所有这些解决方案都只是 ndgrid 的包装,它只适用于双精度数。对非数字集有什么建议吗?

【问题讨论】:

您可以使用适用于整数集的解决方案,然后将结果(组合)视为元胞数组的索引。 密切相关:Matlab - Generate all possible combinations of the elements of some vectors、MATLAB: Enumerating All Combinations of Items in An Arbitrary Number of Sets、How can I create all combinations of characters in sets of text?。前两个处理数字向量,第三个处理字符数组,但基本解决方案对于元胞数组实际上是相同的。 【参考方案1】:

尽管我在my answer 中将这个问题解决为related/near duplicate question,但我在这里发布了我的解决方案的不同版本,因为您似乎想要一个通用 解决方案,而我的其他答案是具体的对于三个输入集的情况。这是一个可以为任意数量的元胞数组输入执行所需操作的函数:

function combMat = allcombs(varargin)
  sizeVec = cellfun('prodofsize', varargin);
  indices = fliplr(arrayfun(@(n) 1:n, sizeVec));
  [indices:] = ndgrid(indices:);
  combMat = cellfun(@(c,i) reshape(c(i(:)), [], 1), ...
                    varargin, fliplr(indices));
  combMat = [combMat:];
end

你可以这样称呼它:

>> combMat = allcombs(A, B)

combMat = 

    'a1'    'b1'
    'a1'    'b2'
    'a1'    'b3'
    'a2'    'b1'
    'a2'    'b2'
    'a2'    'b3'

【讨论】:

【参考方案2】:

2 线策略:

 A = 'a1','a2';
 B = 'b1','b2','b3';

[a b]=ndgrid(1:numel(A),1:numel(B));
C= [A(a(:))' B(b(:))']

C = 
    'a1'    'b1'
    'a2'    'b1'
    'a1'    'b2'
    'a2'    'b2'
    'a1'    'b3'
    'a2'    'b3'

【讨论】:

非常简单干净,我非常喜欢。我接受了 gnovice 的一般性回答,但您的回答对理解他的理解很有帮助。

以上是关于matlab中的元胞数组如何实现批量的赋值呢?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用MATLAB进行元胞数组批量提取数据?

关于MATLAB cell元胞数组中元素的引用问题

matlab中的元胞数组中的数字是字符型保存,存在nodata。。如何转换成数值型矩阵????

如果 MATLAB Rb2020 中的行和列维度不一致,如何取消嵌套具有嵌套数据和文本内容的元胞数组?

如何在 MATLAB 的元胞数组中搜索字符串?

MATLAB中,我要把元胞数组中的字符串提取出来,应该用啥函数?