Использование xlswrite в MATLAB - PullRequest
1 голос
/ 04 мая 2019

Я работаю с тремя наборами данных в 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 раз) в следующую строку вместе со 100 метками во втором столбце и новыми значениями из 2-й строки матрицы Values, транспонированной в третий столбец. Это повторяется до тех пор, пока не будет достигнута длина 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 голосов
/ 04 мая 2019

Вы можете использовать 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, чтобы вы могли объединить все 3 массива ячеек вместе для xlswrite (или writematrix, добавлено в R2019a, что также не рекомендуется xlswrite):

values_repeated = num2cell(reshape(repmat(values, n_dates, 1).', [], 1));
full_array = [dates_repeated, labels_repeated, values_repeated];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...