我有一个代码生成输出文件,其中包含我需要使用MATLAB分析的某些网格的信息。
输出文件如下所示。
Vertex 1 1.3 -2.1 0 {z=(1.3e+0 -2.1e+0) mu=(1.4e-3 2.0e-3) uv=(-0.6 0.4)}
Vertex 2 1.4 -2.1 0 {z=(1.4e+0 -2.1e+0) mu=(2.8e-3 1.5e-3) uv=(-0.6 0.4)}
Vertex 3 -1.9 1.9 0 {z=(-1.9e+0 1.9e+0) mu=(-8.9e-2 1.4e-1) uv=( 0.7 -0.2)}
.
.
.
我希望我的MATLAB代码读入此数据文件并形成包含所有数字的矩阵 按指定的顺序。
因此,我希望将上述3行处理成矩阵
1 1.3 -2.1 0 1.3e+0 -2.1e+0 1.4e-3 2.0e-3 -0.6 0.4
2 1.4 -2.1 0 1.4e+0 -2.1e+0 2.8e-3 1.5e-3 -0.6 0.4
3 -1.9 1.9 0 -1.9e+0 1.9e+0 -8.9e-2 1.4e-1 0.7 -0.2
是否有一些方便的MATLAB工具/命令来执行此操作?
答案 0 :(得分:1)
我认为您可以使用textscan:
示例date.txt:
Vertex 1 1.3 -2.1 0 {z=(1.3e+0 -2.1e+0) mu=(1.4e-3 2.0e-3) uv=(-0.6 0.4)}
Vertex 2 1.4 -2.1 0 {z=(1.4e+0 -2.1e+0) mu=(2.8e-3 1.5e-3) uv=(-0.6 0.4)}
Vertex 3 -1.9 1.9 0 {z=(-1.9e+0 1.9e+0) mu=(-8.9e-2 1.4e-1) uv=( 0.7 -0.2)}
代码:
fileID = fopen('data.txt');
C = textscan(fileID,'Vertex %f %f %f %f {z=(%f %f) mu=(%f %f) uv=(%f %f)}');
fclose(fileID);
mtxC = [C{:}];
结果:
mtxC =
1.0000 1.3000 -2.1000 0 1.3000 -2.1000 0.0014 0.0020 -0.6000 0.4000
2.0000 1.4000 -2.1000 0 1.4000 -2.1000 0.0028 0.0015 -0.6000 0.4000
3.0000 -1.9000 1.9000 0 -1.9000 1.9000 -0.0890 0.1400 0.7000 -0.2000
答案 1 :(得分:0)
我必须用CMM做一次类似的事情,用Python很容易做到(见下文)。您可以使用MATLAB命令regexp(text, expression)
来匹配获得所需内容的正则表达式。这将返回字符串数据,您可以将其保存到数据文件然后load that data file,或使用str2double
转换为数字。
要使用它,首先必须将数据文件作为一系列字符串输入MATLAB。您可以使用fgetl
执行此操作。
in_fid = fopen('my_input_file.txt', 'r');
out_fid = fopen('my_output_file.txt', 'w');
data = [];
line = fgetl(in_fid);
while ischar(line)
match = regexp(line, '[+-]?\d+\.?\d*e?[+-]?\d*', 'match'); % find all matches
% Write to text file
fprintf(out_fid, '%s\t', match); % write values to file with tabs between
fprintf(out_fid, '\n'); % write a new line to the file
% Or save to an array locally
data = [data; str2double(match)];
line = fgetl(in_fid); % grab the next line
end
fclose('all');
% If you wrote to a text file, retrieve the data
data = dlmread('my_output_file.txt', 'delimiter', '\t'); % not sure about this...
请注意,这将不匹配以小数点开头且没有前一个数字的数字,即.2
。另请注意,这将匹配与您提供的任何文件中的模式匹配的数字,因此它是通用的。关于如何匹配浮点数,see this site(虽然为了科学记数法添加了e
部分,但我稍微改了一下)。
我能够在远程计算机上测试regexp
和str2double
操作,看起来直接构建数据数组。我无法测试文件I / O部分,因此可能还存在一些错误。
我建议在Python中使用正则表达式来处理这类事情。我不得不做一次与CMM类似的事情,在Python中很容易做到这样的事情:
import re
# Make pattern to match scientific notation numbers
pattern = re.compile(r"[+-]?\d+\.?\d*e?[+-]?\d*")
with open("your_input_file.txt", "r") as in_file:
with open("your_output_file.txt", "w") as out_file:
for line in in_file:
match = pattern.findall(line) # find all matches in the line
out_file.write("\t".join(match) + "\n") # write the results to a line in your output
有关Python中正则表达式的详细介绍,请参阅Dive Into Python 3,我建议几乎所有人都阅读。我在你的示例文件上对此进行了测试,它给了我:
1 1.3 -2.1 0 1.3e+0 -2.1e+0 1.4e-3 2.0e-3 -0.6 0.4
2 1.4 -2.1 0 1.4e+0 -2.1e+0 2.8e-3 1.5e-3 -0.6 0.4
3 -1.9 1.9 0 -1.9e+0 1.9e+0 -8.9e-2 1.4e-1 0.7 -0.2
your_output_file.txt
中的,所以我认为它有效!最后一步是在MATLAB中只是dlmread('your_output_file.txt', 'delimeter', '\t')
,你应该好好去。
如果你想获得想象力,你可以升级你的Python脚本,以便可以从输入和输出文件作为参数从命令行调用它(查看sys.argv
方法),但这得到了有点复杂,只需打开脚本并手动更改文件名就很容易了。除非您需要一直在不同命名的文件上执行此操作,否则参数是一个很好的路径。 There is a good example of this here