如果我有很多不同尺寸的数组,它们的名称采用以下形式:e1,e2,e3,...,e10等。我如何调用结果的任何一部分,如(e1,e5,e6,e9)或(从e1到e7)?然后我需要将它们组合在一个数组中。为了您的信息,这些数组名称来自此代码:
{clc
clear
a=input('please, select your array :')
b=a(:)'
c=length(b)
for d=1:c
if (d<c)
eval(sprintf('e%d = nchoosek(b,%d)', d,d))
end
end}
我需要的是,将(e1,e2,e3,e4)矩阵垂直组合起来意味着每个矩阵位于一个矩阵中的另一个矩阵下,而不是所有矩阵中的每个矩阵彼此之间。 注意: - 空单元格不包含由于矩阵的不同大小组合而产生的数字,然后,我想用零填充这些单元格
答案 0 :(得分:4)
首先:使用eval
创建变量名称是不好的做法。我建议您将代码更改为以下内容:
a = input('Please, select your array: ')
b = a(:).'
c = length(b)
for d =1:c
if (d<c)
e{d} = nchoosek(b, d);
end
end
发表评论:
您可以使用padarray
插入零,以便所有单元格具有相同的列数。 cellfun
用于对每个单元格执行相同的操作。
cellfun(@(m) padarray(m,[0 max(cellfun(@(n) size(n,2), e)) - size(m,2)],'post'), e,'UniformOutput',0)
Columns 1 through 5
[7x6 double] [21x6 double] [35x6 double] [35x6 double] [21x6 double]
Column 6
[7x6 double]
现在所有矩阵都有相同数量的列,您可以按照您想要的任何方式组合它们,例如使用cell2mat
这样的。{/ p>
cell2mat(x([1 3 5])')
现在你说要垂直组合所有矩阵。您可以将cell2mat
和cellfun
组合在一起,这样做:
cell2mat(cellfun(@(n) n(:), e, 'UniformOutput',0)')
如果你只想要1号和3号,你可以这样做:
cell2mat(cellfun(@(n) n(:), e([1 3]), 'UniformOutput',0)')
cellfun
- 部分相当于:
k = 1;
for ii = [1 3]
f{k} = e{ii}(:);
k = k + 1;
end
cell2mat
垂直连接单元格。
这与您想要垂直对齐以下两个向量的方法相同:
a = [1 3; 2 4];
b = [5 8 11; 6 9 12; 7 10 13];
c = [a(:); b(:)]
c =
1
2
3
4
5
6
7
8
9
10
11
12
13