我正在使用MATLAB中的三个数据集,例如
日期:
有D
个日期,每个日期都是字符,但保存在单元格数组中。
{'01-May-2019','02-May-2019','03-May-2019'....}
标签:
有 100 个标签,每个标签都是字符串,但保存在单元格数组中。
{'A','B','C',...}
值:
[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
函数,但是运气不佳。
如何有效解决此问题?
答案 0 :(得分:0)
您可以使用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
(或{ {3}}(已添加到R2019a中,该版本也弃用了xlswrite
):
values_repeated = num2cell(reshape(repmat(values, n_dates, 1).', [], 1));
full_array = [dates_repeated, labels_repeated, values_repeated];