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

如何将Matlab变量转换为带标题的.dat(文本)文件,matlab,text,header,header-files,text-files,Matlab,Text,Header,Header Files,Text Files,编辑的问题: 在名为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的变量中,我有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_数据_型。

您可以使用
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);
考虑以下代码:

%# 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);

编辑

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


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

@Harpreet:很抱歉
fopen
repmat
中的错误。我将
/t
替换为
\t
,这意味着如果将最后一个字母
t
替换为
n
,则不会有换行符(
\n
)。我解决了问题。另外,我认为您的数据是100x2500,所以我认为您应该有100行2500列。我也更改了格式。@Harpreet:我更改了格式。谢谢你的提醒@Harpreet:更新了代码,现在写入数据值而不是标题的名称。@Harpreet:当然。通过单击“已编辑”按钮,您始终可以在SO上查看所有以前修订的答案link@Harpreet:这正是它所做的,请注意
[x';y';z']
相当于
[x y z]'
,如果您愿意,可以将其编写为:
dlmwrite('outputFile.dat',x','-append'))
之后是
Y
avg_地震数据模型的相同内容
…因此它将创建一个总大小为2500×3×100的矩阵,即:
dlmwrite('outputFile.dat',[X Y avg_地震数据模型],'-append')
(无转置)。我说得对吗?
%# 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',',')