【问题标题】:Using xlswrite in MATLAB在 MATLAB 中使用 xlswrite
【发布时间】:2019-05-04 16:30:59
【问题描述】:

我正在使用 MATLAB 中的三个数据集,例如,

  1. 日期:
    有 D 日期,每个日期都是字符,但保存在单元格数组中。

    {'01-May-2019','02-May-2019','03-May-2019'....}
    
  2. 标签:
    有 100 个标签,每个标签都是字符串,但保存在一个元胞数组中。

    {'A','B','C',...}
    
  3. 价值观:

    [0, 1, 2,...]
    

    这是Values 矩阵的一行,大小为D×100。

我想要 Excel 中的以下输出:

date            labels     Values

01-May-2019       A           0
01-May-2019       B           1
01-May-2019       C           2

直到同一日期重复 100 次。然后,将下一个日期与第二列中的 100 个标签以及来自Values 矩阵第二行的新值一起添加到后续行(+ 重复 100 次)到第三列中。重复此操作,直到达到日期长度 D。

第一次约会,我用的是:

c_1 = {datestr(datenum(dates(1))*ones(100,1))}
c_2 = labels
c_3 = num2cell(Values(1,:)')
xlswrite('test.xls',[c_1, c_2, c_3])

但是,不幸的是,这似乎将所有内容放在一列中,即日期,然后是标签,然后是值数组的第一行。我需要将这些放在三列中。

另外,我认为上述内容需要在我正在考虑的每一天都处于for 循环中。我尝试使用table 函数,但运气不佳。

如何有效地解决这个问题?

【问题讨论】:

    标签: excel matlab


    【解决方案1】:

    您可以使用repmat 和reshape 构建列并(可选)将它们添加到表中以进行导出。

    例如:

    dates = {'01-May-2019','02-May-2019'};
    labels = {'A','B', 'C'};
    values = [0, 1, 2];
    
    n_dates = numel(dates);
    n_labels = numel(labels);
    
    dates_repeated = reshape(repmat(dates, n_labels, 1), [], 1);
    labels_repeated = reshape(repmat(labels, n_dates, 1).', [], 1);
    values_repeated = reshape(repmat(values, n_dates, 1).', [], 1);
    
    full_table = table(dates_repeated, labels_repeated, values_repeated);
    

    给我们下表:

    >> full_table
    
    full_table =
    
      6×3 table
    
        dates_repeated    labels_repeated    values_repeated
        ______________    _______________    _______________
    
        '01-May-2019'           'A'                 0       
        '01-May-2019'           'B'                 1       
        '01-May-2019'           'C'                 2       
        '02-May-2019'           'A'                 0       
        '02-May-2019'           'B'                 1       
        '02-May-2019'           'C'                 2   
    

    应该根据需要导出到带有writetable 的电子表格。

    我们对repmat 和reshape 所做的是“堆叠”这些值,然后将它们转换为一列:

    >> repmat(dates, n_labels, 1)
    
    ans =
    
      3×2 cell array
    
        {'01-May-2019'}    {'02-May-2019'}
        {'01-May-2019'}    {'02-May-2019'}
        {'01-May-2019'}    {'02-May-2019'}
    

    我们转置标签和值,以便将它们编织在一起(例如 [0, 1, 0, 1] 与 [0, 0, 1, 1]),因为 repmat 是列主要的。


    如果您不想要中间表,您可以使用num2cell 从values 创建一个元胞数组,这样您就可以将xlswrite(或writematrix,在 R2019a 中添加)的所有 3 个元胞数组连接在一起,这也弃用了xlswrite):

    values_repeated = num2cell(reshape(repmat(values, n_dates, 1).', [], 1));
    full_array = [dates_repeated, labels_repeated, values_repeated];
    

    【讨论】:

    • 感谢您的帮助!由于 Values 是一个 (D x 100) 数组,是否可以修改您的 values_repeated 行,以便我可以为正在考虑的每个日期 d 拉Values(d, :)'?泰
    • 也许我可以写values_repeated = reshape(Values',[],1);?基本上,这将转置所有的值行并将它们组合起来以获得一个单列向量?泰
    • 对不起,我错过了那部分。后者是正确的,是的。
    • 非常感谢这个优雅的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多