如何连接/指定不同长度的字符串到现有的Matlab表格中?

问题描述:

考虑在Matlab中使用table如何连接/指定不同长度的字符串到现有的Matlab表格中?

a = table(); 
a.c = 'a'; 

如何添加一行包含不同长度的字符串到该表?即我想:

c 
______ 

'a'  
'aa' 

例如这个简单的尝试提供了一个错误:

b = table(); 
b.c = 'aa'; 
result = [a; b] 

错误:

Could not concatenate the table variable 'c' using VERTCAT. Caused by: Error using vertcat Dimensions of matrices being concatenated are not consistent.

+0

简单数组不处理不同长度的字符串连接它们合并两个表。尝试使用单元阵列。 – Nivi

+1

'a = table(); a.c = {'a'; 'aa'}'会这样做,或者'a = table(); a.c = {'a'}; a.c(end + 1,1)= {'aa'};'追加到末尾 – Wolfie

+0

@Wolfie非常感谢!有用 !请将评论转换为答案 - 我会接受它。 (我知道第一种方式 - ac = {'a';'aa'} - 但我的情况我不能使用它,因为它在循环中,并且事先不知道{'a';'aa'},但是第二种方法是OKAY!) –

如果你有数据的整列,你可以从一个单元阵列

tbl = table(); 
tbl.mycol = {'some text'; 
      'something else'; 
      'third item'}; 

创建一个列。如果你想(在一个循环等)追加一个单品,你可以做

tbl = table(); 
mycell = {'some text'; 
      'something else'; 
      'third item'}; 
tbl.mycol = {}; 
for ii = 1:numel(mycell) 
    tbl.mycol(ii) = mycell(ii); 
end 

同样,可以追加到末尾,你会阵列

tbl.mycol(end+1) = {'fourth item'}; 

您可以通过使用vertcat

myothercell = {'append this'; 
       '...and this'}; 
tbl1 = table(); 
tbl1.mycol = mycell; 
tbl2 = table(); 
tbl2.mycol = myothercell; 

tbl3 = vertcat(tbl1, tbl2); 

由于MATLAB的table对象如何对待所包含的数据,它会试图对数据类型进行智能化处理。偶尔,当事情在幕后变得聪明时,他们会以不一定很容易明白的方式被用户绊倒。

这里发生了什么事情是因为你的c列是用字符数组创建的,所以MATLAB试图保持这个列是同质的并且连接'a''aa'。由于MATLAB将character arrays作为字符矩阵进行处理,因此会出错,其中包含大小增强:所有行必须具有相同数量的列。

您有几个选择:使用string array(在R2016b中介绍)或使用cell array。虽然字符串数组本质上是单元阵列,但它们具有专用字符串方法的优点,允许您本地执行各种字符串操作,而无需显式索引到单元格数组中。

更改代码,只需使用双引号(""),而不是单引号(''):

a = table(); 
a.c = "a"; 
b = table(); 
b.c = "aa"; 

T = [a;b] 

将返回:

T = 

    2×1 table 

    c 
    ____ 

    "a" 
    "aa" 

或者,您可以显式强制类型作为单元阵列的c

a = table(); 
a.c = {'a'}; 
b = table(); 
b.c = 'aa'; 

T = [a; b] 

它返回相同的。