【问题标题】:cell2table removes values from first column if string is a single character如果字符串是单个字符,则 cell2table 从第一列中删除值
【发布时间】:2017-01-10 22:49:44
【问题描述】:

假设你有以下数据:

A = [1,2,3;4,5,6];

headers = {'force', 'mass', 'acceleration'};
units = {'N','Kg','m/s^2'};

假设我想将其转换为表格,其中headers 将是'VariableNames'

table_of_data = cell2table([units; num2cell(A)]);
table_of_data.Properties.VariableNames = headers
table_of_data = 
    force    mass    acceleration
    _____    ____    ____________
    N        'Kg'    'm/s^2'     
            [2]     [3]         
            [5]     [6]  

请注意,A 的前两列已被删除。这是因为 MATLAB 对单个字符 N 的处理不同于 'Kg''m/s^2'。如果我在'N ' 之后插入一个空格,我会得到:

table_of_data = 
    force    mass    acceleration
    _____    ____    ____________
    'N '     'Kg'    'm/s^2'     
    [1]      [2]     [3]         
    [4]      [5]     [6]  

我怎样才能得到一个合适的表格,显示所有元素而不插入空格'N '


如果我在单元格数组中添加更多行,例如[headers; units; num2cell(A)],则在units 中使用单个字符是没有问题的,因此以下工作:

table_of_data = cell2table([headers; units; num2cell(A)]);
table_of_data(1,:) = [];
table_of_data.Properties.VariableNames = headers
table_of_data = 
    force    mass    acceleration
    _____    ____    ____________
    'N '     'Kg'    'm/s^2'     
    [1]      [2]     [3]         
    [4]      [5]     [6]  

如何在不使用繁琐的解决方法的情况下解决这个问题?

【问题讨论】:

  • 为什么不将您的单位存储在table.Properties.VariableUnits
  • 发生的事情是它隐式地将整个第一列转换为 char14 看起来像空字符串,对于单个字符,MATLAB 删除了周围的 ''字符串。
  • 我已经意识到了。如果您尝试将其写入 dat 文件,则可以很容易地看到它(例如,可以在记事本中看到)。不过最好避免它:)
  • 看起来很难看,但获得所需内容的最简单方法可能是将单位替换为 units = { {'N'}, {'Kg'}, {'m/s^2'}};
  • @Suever。我正在将其写入 .dat 文件。执行writetable 时不包括VariableUnits

标签: matlab cell


【解决方案1】:

这可能与table 的数据内部表示有关。看起来它所做的是尝试垂直连接列中的数据,如果连接成功,则使用数组,否则将其存储为 cell

在单个字符N和数字14的情况下,它们可以毫无错误地连接起来;但是,它将它们全部转换为字符。

vertcat('N', 1, 4)

但是,当您添加空格时,连接现在会失败

vertcat('N ', 1, 4)

并且输出像单元格一样显示。

你有几个选择:

  1. 使用table.Properties.VariableUnits 存储单位,而不是尝试将单位合并到您的表格中。

    table_of_data.Properties.VariableUnits = units;
    
  2. 在列标题中显示单位

    headers = {'force_N', 'mass_kg', 'acceleration_m_s2'};
    
  3. 创建一个双嵌套元胞数组来存储所有单元,这会显式将其存储为内部元胞数组。

    table_of_data = cell2table([num2cell(units); num2cell(A)])
    

【讨论】:

  • 我相信它是“在创建它之前”。我认为这与实际显示无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2022-11-01
  • 1970-01-01
相关资源
最近更新 更多