Matlab 更改单元格数组的格式

Matlab 更改单元格数组的格式,matlab,matrix,cell-array,Matlab,Matrix,Cell Array,我有一个a,它是640x1单元格,其中每个单元格a(I,1)的值因行而异,例如: A(1,1)=[] A(2,1)=[1] A(3,1)=[1,2,3] 我想做的是将A转换成这样: A(1,1)=[] A(2,1)=1 A(3,1)=1; A(3,2)=2; A(3,3)=3 这样每个单元格只有一个值。如果有人能帮助我,我该怎么做?这是whoa的一部分 A= [] 0 0 0 145 [144;192] [145;197;307] 例如: % first lets create some

我有一个
a
,它是640x1单元格,其中每个单元格
a(I,1)
的值因行而异,例如:

A(1,1)=[]
A(2,1)=[1]
A(3,1)=[1,2,3]
我想做的是将
A
转换成这样:

A(1,1)=[]
A(2,1)=1
A(3,1)=1; A(3,2)=2; A(3,3)=3
这样每个单元格只有一个值。如果有人能帮助我,我该怎么做?这是who
a
的一部分

A=
[]
0
0
0
145
[144;192]
[145;197;307]
例如:

% first lets create some random cellarray containing data of different length
A = cell(10,1);
for i=1:numel(A)
    A{i} = rand(1,randi([0 5]));
end

% determine the maximum number of columns
colnum = max(cellfun(@numel, A));

% create new cellarray, and fill each row
B = cell(numel(A),colnum);
for i=1:numel(A)
    if isempty(A{i}), continue; end
    B(i,1:numel(A{i})) = num2cell(A{i});
end
因此,我将第一个单元格数组设置为:

>> celldisp(A)
A{1} =
    0.2217    0.1174    0.2967    0.3188
A{2} =
    0.5079    0.0855
A{3} =
    0.8010
A{4} =
     []
A{5} =
    0.7303    0.4886    0.5785    0.2373    0.4588
A{6} =
    0.5468    0.5211    0.2316    0.4889    0.6241
A{7} =
    0.3955    0.3674    0.9880    0.0377
A{8} =
    0.9133    0.7962    0.0987    0.2619    0.3354
A{9} =
    0.1366    0.7212    0.1068    0.6538
A{10} =
    0.7791    0.7150
结果变成:

>> B
B = 
    [0.2217]    [0.1174]    [0.2967]    [0.3188]          []
    [0.5079]    [0.0855]          []          []          []
    [0.8010]          []          []          []          []
          []          []          []          []          []
    [0.7303]    [0.4886]    [0.5785]    [0.2373]    [0.4588]
    [0.5468]    [0.5211]    [0.2316]    [0.4889]    [0.6241]
    [0.3955]    [0.3674]    [0.9880]    [0.0377]          []
    [0.9133]    [0.7962]    [0.0987]    [0.2619]    [0.3354]
    [0.1366]    [0.7212]    [0.1068]    [0.6538]          []
    [0.7791]    [0.7150]          []          []          []
其中,我们以二维单元数组的形式访问元素:

>> B{5,3}
ans =
    0.5785

编辑: 下面是一个稍微不同的实现:

len = cellfun(@numel, A);
padding = arrayfun(@(n)cell(1,n), max(len)-len, 'UniformOutput',false);
B = cellfun(@num2cell, A, 'UniformOutput',false);
B = cellfun(@(b,pad) [b{:} pad], B, padding, 'UniformOutput',false);
B = cat(1, B{:});

编辑2: 请注意,上面的命令将返回一个2D单元格数组。这是因为常规数字矩阵不能交错(所有行必须具有相同的长度)

如果要获得2D数值矩阵,则必须插入
NaN
值作为填充:

C = B;
C(cellfun(@isempty,C))= {NaN};
C = cell2mat(C)
输出:

>> C
C =
    0.2217    0.1174    0.2967    0.3188       NaN
    0.5079    0.0855       NaN       NaN       NaN
    0.8010       NaN       NaN       NaN       NaN
       NaN       NaN       NaN       NaN       NaN
    0.7303    0.4886    0.5785    0.2373    0.4588
    0.5468    0.5211    0.2316    0.4889    0.6241
    0.3955    0.3674    0.9880    0.0377       NaN
    0.9133    0.7962    0.0987    0.2619    0.3354
    0.1366    0.7212    0.1068    0.6538       NaN
    0.7791    0.7150       NaN       NaN       NaN

谢谢你的回答。这是一个显示
a
@user1460166的链接:好的,试试新版本,我修复了这两个实现。是否可以检查此链接中的问题,其中C的格式将是您在此解决方案中提供的格式