我的任务是阅读文本文件,以便使用MATLAB进行进一步的计算工作。所以,我的问题是如何读取文本数据并将值保存到变量中作为示例:
A= [vertical angles]; B= [Horizontal angles]; C= [vertical data];
我尝试了 dlmwrite
这个函数
M = dlmread(filename,'/t ',2,0)
a=M(2:3); ver=M([5:a(1)+4]);
hor = M([a(1)+4:a(2)+a(1)]);...
但是dlmread()
成功读取了文件大小的一半。
我还尝试使用带有textscan()
循环的 while
函数来阅读该文件。结果是在Cell数组中,这让我不知道如何根据我的要求分开
file =fopen(filename);
line = fgets(file);
data={};
a=1;
while ischar(line)
ar=textscan(line,'%f');
for i = 1:length(n)
data{i,a}=ar{i};
end
line=fgets(file);
a=a+1;
end
以下是文本文件顺序的示例,我的分配中使用的文件按数组大小的顺序data =(1500x1800)......
NAME
PRODUCT
0 24 30 2 % Here 24,30 denotes the vertical and horizontal data which can be considered as Matrix size %
20 21 22 44 25 56 78 79 89 29 59 14 %% vertical angles length(vector)=25
20.5 20.6 20.7 20.9 30 30.9 81 91
15 19 16 18 5
10 12 13 16 17 18 19 18 20 16 18 15 %% Horizontal angles length(vector)=29
20.6 20.7 20.8 15 14 16 18 19 20 30.5
19 20 16 15.6 18 19 20
80 51 22 34 25 56 78 29 59 29 59 14 %% here starts the vertical data i.e length of vector 25
20.3 20.6 20.8 20.9 36 30.9 81 91
15 15 18 16 5
.
.
.
No. of horizontal i.e 29
答案 0 :(得分:1)
如果我理解你的需要,那么这不是很优雅,而是必须做的事情:
values = [];
vert_len = NaN;
horz_len = NaN;
offset = 1;
values_offset = 1;
fid = fopen('myfile.txt');
line = fgetl(fid);
while (ischar(line))
line = strtrim(line);
switch (offset)
case {1 2}
case 3
split = strsplit(line,' ');
header = sscanf(sprintf('%s*',split{:}),'%f*');
vert_len = header(2);
horz_len = header(3);
otherwise
split = strsplit(line,' ');
values_line = sscanf(sprintf('%s*',split{:}),'%f*');
values = [values; values_line];
end
line = fgets(fid);
offset = offset + 1;
end
A = values(1:vert_len);
B_offset_1 = vert_len + 1;
B_offset_2 = B_offset_1 + horz_len - 1;
B = values(B_offset_1:B_offset_2);
C = values(B_offset_2+1:end);
此
sscanf(sprintf('%s*',mycell{:}),'%f*')
是将字符串转换为double的最快的已知方法之一。
这是我使用的模板(你的模板,通过修复,仍然是错误的):
NAME
PRODUCT
0 25 29 2
20 21 22 44 25 56 78 79 89 29 59 14
20.5 20.6 20.7 20.9 30 30.9 81 91
15 19 16 18 5
10 12 13 16 17 18 19 18 20 16 18 15
20.6 20.7 20.8 15 14 16 18 19 20 30.5
19 20 16 15.6 18 19 20
80 51 22 34 25 56 78 29 59 29 59 14
20.3 20.6 20.8 20.9 36 30.9 81 91
15 15 18 16 5