如何以下列方式操作数据?

时间:2011-06-30 06:27:54

标签: matlab file-io

我有一个名为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];

2 个答案:

答案 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函数用于解析文件

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

MATLAB代码

%# 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]