在MATLAB中使用xlswrite

时间:2019-05-04 16:30:59

标签: excel matlab

我正在使用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函数,但是运气不佳。

如何有效解决此问题?

1 个答案:

答案 0 :(得分:0)

您可以使用repmatreshape构建列,并将列(可选)添加到表中以进行导出。

例如:

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的电子表格。

我们对repmatreshape所做的工作是“堆叠”值,然后将它们转换为单列:

>> 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是主要列。


如果您不需要中间表,则可以使用num2cellvalues创建一个单元格数组,以便可以将xlswrite(或{ {3}}(已添加到R2019a中,该版本也弃用了xlswrite):

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