我有一个名为data.dat
的文件,内容为(样本):
0.0 2.3 4.5 0.9 0.5 3.4 0.0 0.3 0.5 E F
2.9 5.4 7.2 4.8 3.7 9.1 2.3 4.1 5.6
3.4 6.1 4.8 6.4 0.4 0.6 0.3 5.4 7.1
0.0 2.3 4.5 0.9 0.5 3.4 0.0 0.3 0.5 E F
2.9 5.4 7.2 4.8 3.7 9.1 2.3 4.1 5.6
3.4 6.1 4.8 6.4 0.4 0.6 0.3 5.4 7.1
.
.
.
我正在尝试将每个3行数组合并到最后一行数组中,以提供f x 29
的矩阵:
0.0 2.3 4.5 0.9 0.5 3.4 0.0 0.3 0.5 E F 2.9 5.4 7.2 4.8 3.7 9.1 2.3 4.1 5.6 3.4 6.1 4.8 6.4 0.4 0.6 0.3 5.4 7.1
0.0 2.3 4.5 0.9 0.5 3.4 0.0 0.3 0.5 E F 2.9 5.4 7.2 4.8 3.7 9.1 2.3 4.1 5.6 3.4 6.1 4.8 6.4 0.4 0.6 0.3 5.4 7.1
.
.
.
然后将第10和第11列移到第1和第2行:
E F 0.0 2.3 4.5 0.9 0.5 3.4 0.0 0.3 0.5 2.9 5.4 7.2 4.8 3.7 9.1 2.3 4.1 5.6 3.4 6.1 4.8 6.4 0.4 0.6 0.3 5.4 7.1
E F 0.0 2.3 4.5 0.9 0.5 3.4 0.0 0.3 0.5 2.9 5.4 7.2 4.8 3.7 9.1 2.3 4.1 5.6 3.4 6.1 4.8 6.4 0.4 0.6 0.3 5.4 7.1
我如何在MATLAB中执行此操作?这是我的尝试,但这是不正确的。
% Find out number of rows in file
rline=0;
x=0;
% Open Data File
fid = fopen('data.dat','rt');
% Loop through data file until we get a -1 indicating EOF
while(x~=(-1))
x=fgetl(fid);
rline=rline+1;
end
rline = rline-1;
% How many row in final file
fline=rline/3; % one row in final file represent by 3 rows from raw data
% Create 3 seperate matrix named as z1,z2,z3
frewind(fid);
for i = 1:rline
num1 = fscanf(fid,'%f %f %f %f %f %f %f %f %f\n')'; % Read in numbers
name1 = fscanf(fid,'%s %s',rline); % Filter out string at end of line
if(i==1)
result1 = num1; % Add 1st row
names1 = name1; % Add 1st text string
else
result1 = [result1;num1]; % Add additional rows
names1 = char(names1,name1); % Add next string
names1 = names1';
end
i=i+3;
end
fclose(fid);
z1 = result1;
zname= names1;
frewind(fid);
for i = 2:rline
num2 = fscanf(fid,'%f')'; % Read in numbers
if(i==2)
result2 = num2; % Add 2nd row
else
result2 = [result2;num2]; % Add additional rows
end
i=i+3;
end
fclose(fid);
z2 = result2;
frewind(fid);
for i = 3:rline
num3 = fscanf(fid,'%f')'; % Read in numbers
if(i==3)
result3 = num3; % Add 3rd row
else
result3 = [result3;num3]; % Add additional rows
end
i=i+3;
end
fclose(fid);
z3 = result3;
% Create a final data matrix of F = (fline x 29)
for i = 1: fline
for j = 1: fline
F(i, [1:2]) = zname(j,:);
F(i, [3:11]) = z1(j,:);
F(i, [12:20]) = z2(j,:);
F(i, [21:29]) = z3(j,:);
j=j+1;
end
i=i+1;
end
Final_data = [F];
答案 0 :(得分:0)
您可以使用Matlab轻松操作数组,无需循环。我将使用一个较小的数组,以便更容易看到发生了什么。我也会使用Octave,但这里没什么区别。我还假设矩阵已经在变量中可用(使用load
来执行此操作,它比问题中的方法更容易)。
首先,考虑矩阵A
:
octave-3.0.0:23> A
A =
1 7
2 8
3 9
4 10
5 11
6 12
可以使用reshape
组合前三行。由于Matlab按列工作,因此您实际上需要将reshape
应用于A
的转置:
octave-3.0.0:24> B = reshape(A', 6, 2)'
B =
1 7 2 8 3 9
4 10 5 11 6 12
要重新定位列,只需使用Matlab的漂亮索引功能。给出一个具有所需顺序的向量作为列索引,通过给出一个冒号:
作为行索引来获取所有行:
octave-3.0.0:25> B(:,[5,6,1:4])
ans =
3 9 1 7 2 8
6 12 4 10 5 11
答案 1 :(得分:0)
我使用您提供的示例数据文件作为示例。 TEXTSCAN函数用于解析文件
0.0 2.3 4.5 0.9 0.5 3.4 0.0 0.3 0.5 E F
2.9 5.4 7.2 4.8 3.7 9.1 2.3 4.1 5.6
3.4 6.1 4.8 6.4 0.4 0.6 0.3 5.4 7.1
0.0 2.3 4.5 0.9 0.5 3.4 0.0 0.3 0.5 E F
2.9 5.4 7.2 4.8 3.7 9.1 2.3 4.1 5.6
3.4 6.1 4.8 6.4 0.4 0.6 0.3 5.4 7.1
%# parse data file
fid = fopen('data.dat','rt');
C = textscan(fid, [repmat('%f ',[1 9]) '%s %s'], 'CollectOutput',true);
fclose(fid);
%# extract and reshape numeric data
M = C{1};
M = reshape(M', size(M,2)*3, [])'; %# similar to 'Michael J. Barber' answer
%# extract textual data
T = C{2}(1:3:end,:);
%# we can merge all into one cell array
data = [T num2cell(M)];
请注意,由于数据包含异构类型(数字和字符),因此我们会分别读取和存储它们。最后一行代码显示了将所有数据合并为单个单元格数组的一种方法:
data =
'E' 'F' [0] [2.3000] [4.5000] [0.9000] [0.5000] [3.4000] [0] [0.3000] [0.5000] [2.9000] [5.4000] [7.2000] [4.8000] [3.7000] [9.1000] [2.3000] [4.1000] [5.6000] [3.4000] [6.1000] [4.8000] [6.4000] [0.4000] [0.6000] [0.3000] [5.4000] [7.1000]
'E' 'F' [0] [2.3000] [4.5000] [0.9000] [0.5000] [3.4000] [0] [0.3000] [0.5000] [2.9000] [5.4000] [7.2000] [4.8000] [3.7000] [9.1000] [2.3000] [4.1000] [5.6000] [3.4000] [6.1000] [4.8000] [6.4000] [0.4000] [0.6000] [0.3000] [5.4000] [7.1000]