从matlab中高效地编写CSV文件



我有3个数组要写入csv文件:

dates_array—matlab串行日期的T x 1矢量;

观测-数值数据的T x N阵列;

string_array-字符串的N x 1矢量

我想把所有的东西都放入一个面板格式的单元格数组中。我可以为此做一个for循环。但当T和N非常大时,这是非常低效的;

clear all
clc
% Generate Data
T = 1000;
N = 100;
dates_array = 737791:1:737791+T-1;
dates_array = dates_array';
observations = rand(T,N);
string_array = string(char(randi([33 126],N,10)));
% Put in panel format
count = 1;
for i = 1:N
for j=1:T
out_for_csv{count,1} = {datestr(dates_array(j,1))};
out_for_csv(count,2) = {observations(j,i)};
out_for_csv(count,3) = {string_array(i,1)};
count = count + 1;
end
end

Tab = cell2table(out_for_csv);
writetable(Tab,'myDataFile.csv')

需要有一种更好的方法来代替循环。我确实尝试了一些东西,但总是无法将所有东西放在out_for_csv矩阵上。

例如,获得三列矢量的一种有效方法是:

column1 = repmat(datestr(dates_array(j,1)),N,1);
column2 = observations(:);
column3 = repelem(string_array,T,1);

现在我只需要弄清楚如何将这三列放在一起。

我设法将计算机上的执行时间从大约21秒缩短到1.5秒,速度提高了14倍!真正让事情进展得很快的是在内存中构建一个大型字符矩阵,然后用一个fprintf命令将其写出。

我对代码做了几个小改动,就是给随机数生成器植入种子,这样我就可以得到一致的随机数,这样我可以将原始代码与新代码进行比较。我还限制了随机字符串只能是大写字母,因为原始代码有时会选择逗号,这会导致在Excel中读取输出文件时列数不一致。

一个棘手的问题是,当您使用fprintf写出字符maxtrix时,您需要对其进行转置,因为fprintf首先处理每一列。

这是代码:

T = 1000;
N = 100;
dates_array = 737791 + (0:(T-1))';
dates_array = datestr(dates_array);
% Add a comma after the dates
dates_array = [dates_array, repmat(',', T, 1)];
% Replicate the dates N times
dates_array = repmat(dates_array, N, 1);
% Seed the randon number generator to get consistent values so comparisons between versions can be made
rng(0)
observations = rand(T, N);
% convert from a matrix to a column
observations = reshape(observations, T*N, 1);
% Convert from numbers to characters
observations = num2str(observations, 5);
% Add a comma after the observations
observations = [observations, repmat(',', T*N, 1)];
% Make the matrix of strings
string_array = char(randi([65 90], 1, N * 10));
% Replicate T times
string_array = repmat(string_array, T, 1);
% Turn matrix of 10-char strings into a vector of 10-char strings
string_array = reshape(string_array, N * T, 10);
% Join the date, observations, strings, and carriage return
out = [dates_array, observations, string_array, repmat(newline, T*N, 1)];
title_row = 'col1,col2,col3';
num_extra_commas = size(out, 2) - length(title_row) - 1;
title_row = [title_row, repmat(',', 1, num_extra_commas), newline];
out = [title_row; out];
fid = fopen('myDataFileb.csv', 'wt');
fprintf(fid, '%s', out');
fclose(fid);

最新更新