如何将 Matlab 变量转换为带有标题的 .dat(文本)文件

Posted

技术标签:

【中文标题】如何将 Matlab 变量转换为带有标题的 .dat(文本)文件【英文标题】:How to convert Matlab variables to .dat (text) file with headers 【发布时间】:2011-03-11 12:08:46 【问题描述】:

已编辑问题:

我在名为 avg_data_models 的变量中有 2500 行 x 100 列数据。我还有 2500 行 x 100 列变量“X”和类似大小的矩阵变量“Y”,两者都包含坐标。我想将此变量的值保存在文本 (.dat) 文件中,该文件必须以下列方式包含 302 个标题行:

avg_data_models
300
X_1
X_2
.
.
.
X_100
Y_1
Y_2
.
.
.
Y_100
avg_data_models_1
avg_data_models_2
avg_data_models_3
.
.
.
.
.
avg_data_models_100

在上面的标题样式中,第一行是文件名,第二行告诉列数(每列有2500行),剩下的300行分别代表每个变量的模型——比如 100 个 X 模型、100 个 Y 模型和 100 个 avg_data_models 模型。

【问题讨论】:

【参考方案1】:

考虑这段代码:

%# here you have your data X/Y/..
%#X = rand(2500,100);

[r c] = size(X);
prefixX = 'X';
prefixY = 'Y';
prefixData = 'avg_data_models';

%# build a cell array that contains all the header lines
num = strtrim( cellstr(num2str((1:c)','_%d')) );   %#' SO fix
headers = [ prefixData ;
            num2str(3*c) ;
            strcat(prefixX,num) ;
            strcat(prefixY,num) ;
            strcat(prefixData,num) ];

%# write to file
fid = fopen('outputFile.dat', 'wt');
fprintf(fid, '%s\n',headers:);
fclose(fid);

编辑

似乎我误解了这个问题。这是编写实际数据的代码(不是标题!):

%# here you have your data X/Y/..
avg_data_models = rand(2500,100);
X = rand(2500,100);
Y = rand(2500,100);

%# create file, and write the title and number of columns
fid = fopen('outputFile.dat', 'wt');
fprintf(fid, '%s\n%d\n', 'avg_data_models', 3*size(X,2));
fclose(fid);

%# append rest of data
dlmwrite('outputFile.dat', [X Y avg_data_models], '-append', 'delimiter',',')

注意:我使用逗号,作为分隔符,如果你愿意,你可以将其更改为空格或制表符\t..

【讨论】:

@Harpreet:更新了代码,现在写入数据值而不是标题的名称.. @Harpreet:当然。通过单击“已编辑 ”链接,您始终可以查看 SO 上所有以前的答案修订版 @Harpreet:这正是它在做什么,注意[x';y';z'] 等同于[x y z]' 如果你愿意,你可以把它写成:dlmwrite('outputFile.dat', X', '-append') 然后Yavg_seismic_data_models 也一样... 所以它将创建一个总大小为 2500×3*100 的矩阵,即:dlmwrite('outputFile.dat', [X Y avg_seismic_data_models], '-append')(没有转置)。我说的对吗?【参考方案2】:

您可以使用fprintf 来编写标题,如下所示:

%# define the number of data
nModels = 100;
dataName = 'avg_data_models';

%# open the file
fid = fopen('output.dat','w');

%# start writing. First line: title
fprintf(fid,'%s\n',dataName); %# don't forget \n for newline. Use \n\r if yow want to open this in notepad

%# write number of models
fprintf(fid,'%i\n',nModels)

%# loop to write the rest of the header
for iModel = 1:nModels
fprintf(fid,'%s_%i\n',dataName,iModel);
end

%# use your favorite method to write the rest of the data. 
%# for example, you could use fprintf again, using /t to add tabs 
%# create format-string
%# check the help to fprintf to learn about formatting details
formatString = repmat('%f\t',1,100);
formatString = [formatString(1:end-1),'n']; %# replace last tab with newline

%# transpose the array, because fprintf reshapes the array to a vector and 
%# 'fills' the format-strings sequentially until it runs out of data
fprintf(fid,formatString,avg_data'); %'# SO formatting

%# close the file
fclose(fid);

【讨论】:

@Harpreet:对于fopenrepmat 中的错误,我们深表歉意。我放了/t而不是\t,这意味着如果你用n替换最后一个字母t,就没有换行符(\n)。我解决了这些问题。另外,我认为您的数据是 100x2500,所以我认为您想要 100 行 2500 列。我也改了。 @Harpreet:我进行了格式更改。感谢您的提醒!

以上是关于如何将 Matlab 变量转换为带有标题的 .dat(文本)文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有固定浮点的matlab中转换变量

如何将Matlab中的数值型变量转换成字符型变量

如何将excel数据文件转换成MATLAB中的.mat文件?

将变量名转换为字符串 MATLAB

将带有全局变量的递归转换为使用堆栈的迭代

如何将 Maple 中的符号变量导出到文本文件(Matlab 格式)?