matlab使用cell2mat并将数据重塑为其他形式

时间:2014-01-04 14:54:28

标签: arrays matlab

我有单元格数组

  Columns 1 through 6

    [8x8 uint8]    [8x8 uint8]    [8x8 uint8]    [8x8 uint8]    [8x8 uint8]    [8x8 uint8]

  Columns 7 through 8

    [8x8 uint8]    [8x8 uint8]

如果我使用cell2mat函数,我会得到这个

     Columns 1 through 18

0    1    0    1    0    0    1    0    0    0    1    0    0    0    0    1    0    0
0    1    1    1    0    0    1    1    1    1    0    0    0    1    0    1    1    0
0    1    1    1    0    1    0    1    1    0    1    1    0    1    0    1    0    1
0    1    1    0    0    1    0    0    1    0    1    0    0    0    0    0    0    1
0    1    1    1    1    0    0    1    1    0    0    0    1    1    0    1    0    0
0    1    1    0    1    1    1    1    1    0    1    1    0    0    0    1    0    0
0    1    1    0    1    1    0    1    1    1    1    1    0    1    0    1    0    1
0    1    1    0    0    1    0    0    1    1    0    0    1    1    0    1    1    1

第19至36栏

1    1    0    0    0    0    0    0    0    0    0    0    0    1    0    0    0    0
0    0    0    1    1    1    0    0    0    0    0    0    1    0    0    0    0    0
1    1    0    1    1    0    0    0    0    1    1    1    0    1    0    0    0    0
0    0    0    0    1    0    0    1    0    1    1    0    1    0    0    1    0    0
1    1    0    1    1    1    0    0    0    1    1    0    0    1    0    1    1    1
1    1    0    1    1    1    1    1    0    1    1    1    0    0    0    1    1    0
0    1    0    1    1    0    0    0    0    1    1    0    1    0    0    1    1    0
0    0    0    0    1    0    0    0    0    1    1    1    0    1    0    1    1    1

现在我想要8列的矩阵。 我想要的是这个

0    1    0    1    0    0    1    0
0    1    1    1    0    0    1    1
0    1    1    1    0    1    0    1
0    1    1    0    0    1    0    0
0    1    1    1    1    0    0    1
0    1    1    0    1    1    1    1
0    1    1    0    1    1    0    1
0    1    1    0    0    1    0    0

0    0    1    0    0    0    0    1
1    1    0    0    0    1    0    1
1    0    1    1    0    1    0    1
1    0    1    0    0    0    0    0
1    0    0    0    1    1    0    1
1    0    1    1    0    0    0    1
1    1    1    1    0    1    0    1
1    1    0    0    1    1    0    1

。 。 。 。

3 个答案:

答案 0 :(得分:1)

如果我正确地得到了您的问题,您只需要在转换之前转置单元格数组。请参阅以下示例(我编辑了实际输出以稍微压缩显示):

> a
a = 
{
  [1,1] =
     1   0   0
     0   1   0
     0   0   1
  [1,2] =
     2   0   0
     0   2   0
     0   0   2
  [1,3] =
     3   0   0
     0   3   0
     0   0   3    
}
> cell2mat(a)
ans =
   1   0   0   2   0   0   3   0   0
   0   1   0   0   2   0   0   3   0
   0   0   1   0   0   2   0   0   3

> cell2mat(a')
ans =
   1   0   0
   0   1   0
   0   0   1
   2   0   0
   0   2   0
   0   0   2
   3   0   0
   0   3   0
   0   0   3

请注意,使用重塑会带来另一种顺序:

> reshape(cell2mat(a), 9,3)
ans =
   1   2   3
   0   0   0
   0   0   0
   0   0   0
   1   2   3
   0   0   0
   0   0   0
   0   0   0
   1   2   3

答案 1 :(得分:0)

只需转置你的单元格数组然后将它传递给cell2mat就足够了。

另一个(不太优选,MATLAB中通常不欢迎循环)解决方案是遍历您的单元阵列并使用矩阵连接。如果您的单元格数组名称为ca,则可以执行以下操作:

imat = []; for i = 1:numel(ca); imat = [imat; ca{i}]; end

答案将在imat。

答案 2 :(得分:0)

您可以使用重塑功能。

tmp = cell2mat(...);

res = reshape(tmp, numel(tmp)/8, 8);