具有空白和重新排列的填充单元阵列

时间:2015-09-03 10:08:50

标签: matlab cell-array

我有一个2D单元格数组(A = 2x3),其中包含不等长度的数字向量,其形式如下:

1x3 1x4 1x2
1x7 1x8 1x3

*Size of A (in both dimensions) can be variable

我想用空格{' '}填充每个向量以将它们的长度均衡为lens = max(max(cellfun('length',A))); - 在这种情况下,所有向量的大小将变为1x8 - 然后随后将单元格数组重新排列为此形式这样就可以使用cell2table(使用示例数据)将其转换为柱状表:

4   1   2   1   3   4
8   5   8   4   7   9
10  12  11  5   []  11
[]  13  21  7   []  []
[]  15  []  11  []  []
[]  18  []  23  []  []
[]  21  []  29  []  []
[]  []  []  32  []  []

[] =空白

即。列的顺序为A {1,1},A {2,1},A {1,2},A {2,2},A {1,3}和A {2,3}。

如果A = 4x3,重排后的前五列将是A {1,1},A {2,1},A {3,1},A {4,1}和A {1,2 }。

3 个答案:

答案 0 :(得分:2)

不幸的是,我没有时间对此进行测试,但我相信如果您想快速而简单地执行此操作,则无需编写显式循环。

b = cellfun(@(c) [c, repmat(' ', 1, 197-numel(c))], a,'UniformOutput',0)

修改

我这里没有MATLAB,之前从未使用过table,所以我不确切知道它是如何工作的。但是,我认为最简单的方法是使用上面的行,但不是尝试用空格填充,而是用NaN填充它。之后,当您使用NaN制作表格时,您可以执行以下操作:

所以:

B = A(:);   % Straighten it out
C = cellfun(@(c) [c, repmat(NaN, 1, 8-numel(c))], B,'UniformOutput',0) % 1x8 vectors

%% Create table %%

tab(tab == NaN) = ' ';

很抱歉,如果这没有帮助。这就是我现在所能做的一切。

答案 1 :(得分:2)

我的Matlab版本(R2013a)没有cell2table所以喜欢 Stewie Griffin 我不确定转换所需的确切格式。

我也不确定double whitespace 的填充向量是否是个好主意。 stringsdouble不方便混合使用。特别是在您的情况下,您只需要同类型的单元格数组列(而不是列,其中每个元素都是cell)。这意味着你必须:

  • 首先将您的数字转换为字符串(例如char数组)。
  • 由于该列将是char数组,因此它们需要在维度上是同质的,因此您必须找到最长的字符串并使它们具有相同的长度。
  • 最后,您可以使用必要数量的空白填充char数组列

一种方法是在我们实际进行填充/重新整形之前,需要多次cellfun调用来探测我们需要的所有这些信息:

%// get the length of the longest vector
Lmax = max(max(cell2mat(cellfun( @numel , A  , 'uni',0)))) ;
%// get the maximum order of magnitude
n = max(max(cell2mat(cellfun( @(x) max(ceil(log10(x))) , A  , 'uni',0)))) 
%// prepare string format based on "n"
fmt = sprintf('%%0%dd',n) ;
%// pad columns with necessary number of whitespace
b = cellfun( @(c) [num2str(c(:),fmt) ; repmat(' ', Lmax-numel(c),n)], A ,'uni',0 ) ;
%// reshape to get final desired result
b = b(:).' 

b = 
    [8x2 char]    [8x2 char]    [8x2 char]    [8x2 char]    [8x2 char]    [8x2 char]

请注意,调用str2num会产生原始单元格数组(几乎不会reshape操作),因为str2num会忽略(返回empty whitespace 条目。

>> bf = cellfun( @str2num , b,'un',0 )
bf = 
    [3x1 double]    [7x1 double]    [4x1 double]    [8x1 double]    [2x1 double]    [3x1 double]

如果我正在处理数字,我肯定更喜欢使用numeric类型的填充(也使操作稍微容易一些)。这是一个带有'NaN's:

的填充示例
%// get the length of the longest vector
Lmax = max(max(cell2mat(cellfun( @numel , A  , 'un',0)))) ;
%// pad columns with necessary number of NaN
b = cellfun( @(c) [c(:) ; NaN(Lmax-numel(c),1)], A ,'un',0 ) ;
%// reshape to get final desired result
b = b(:).' 

b = 
    [8x1 double]    [8x1 double]    [8x1 double]    [8x1 double]    [8x1 double]    [8x1 double]

如果您不喜欢使用NaN进行操作,则可以选择一个不属于数据集可能值的数值。例如,如果您的所有值都应该是正整数,-1就是特殊值的良好指标。

%// choose your NULL value indicator
nullNumber = -1 ;
b = cellfun( @(c) [c.' ; zeros(Lmax-numel(c),1)+nullNumber], A ,'un',0 ) ;
b = b(:).' 

cell2mat(b)
ans =
     4     1     2     1     3     4
     8     5     8     4     7     9
    10    12    11     5    -1    11
    -1    13    21     7    -1    -1
    -1    15    -1    11    -1    -1
    -1    18    -1    23    -1    -1
    -1    21    -1    29    -1    -1
    -1    -1    -1    32    -1    -1

注意:

如果-1是您的集合的可能值,并且您仍然不想使用NaN,这是我所在行业中广泛使用的值(对完全过敏 NaN)作为所有实数的null指标-999.25。除非你有一个非常具体的应用程序,否则在正常操作期间完全这个值的概率是如此微不足道,以至于大多数软件算法在遇到null值时都可以识别-999.25值。 {1}}。 (如果只处理整数,它们有时只使用-999。)

另请注意在c(:)来电中使用cellfun。这样可以确保向量(在每个单元格中)将被排列为(无论其原始形状如何(因为您的初始向量实际上位于中)在你的例子中。)

答案 2 :(得分:0)

用白色空格填充矢量:

YourString = 'text here';
YourString = [YourString ' '];

如果只需要1个空格。如果需要更多,您可以循环此代码以获得所需的空格数。

table本身已经具有打印单元格的功能。

感谢@StewieGriffin:

[YourString, repmat(' ',1,197-numel(YourString)]