我有一个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 }。
答案 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 的填充向量是否是个好主意。 strings
和double
不方便混合使用。特别是在您的情况下,您只需要同类型的单元格数组列(而不是列,其中每个元素都是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)]