我正在尝试读取写入文本文件的张量元素.文件的第一行定义张量维度.下一行给出张量值.在Matlab语法中,我能够通过以下代码行实现这一点,但是我在Julia编写等效函数时遇到了困难.任何帮助是极大的赞赏.
fid=fopen(fname);
shape = sscanf(fgetl(fid),'%i');
for j = 1:shape(3)
for i = 1:shape(1)
A(i,:,j) = str2num(fgets(fid));
end
end
fclose(fid);
Run Code Online (Sandbox Code Playgroud)
典型文件的第一行如下:
4 4 48
1.00000 0.00000 0.00000 0.00000
0.00000 1.00000 0.00000 0.00000
0.00000 0.00000 1.00000 0.00000
0.00000 0.00000 0.00000 1.00000
-1.00000 0.00000 0.00000 0.00000
0.00000 1.00000 0.00000 0.00000
0.00000 0.00000 -1.00000 0.00000
0.00000 0.00000 0.00000 1.00000
-1.00000 0.00000 0.00000 0.00000
...
Run Code Online (Sandbox Code Playgroud)
正如@colin在他的评论中所说,这样的文件很容易被读入Julia:
julia> data, heading = readdlm("/tmp/data.txt", header=true)
(
9x4 Array{Float64,2}:
1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
-1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 -1.0 0.0
0.0 0.0 0.0 1.0
-1.0 0.0 0.0 0.0,
1x4 Array{AbstractString,2}:
"4" "4" "48" "")
Run Code Online (Sandbox Code Playgroud)
返回的两个值是Float64s数组,标题行是字符串数组.
有用吗?
如果您确实想逐行阅读,可以使用以下命令:
a = open("/path/to/data.txt", "r")
for line in eachline(a)
print(line) ## or whatever else you want to do with the line.
end
close(a)
Run Code Online (Sandbox Code Playgroud)
特别是,像这样的语法:
LineArray = split(replace(line, "\n", ""), "\t")
Run Code Online (Sandbox Code Playgroud)
可能对你有用。它将 (a) 删除行末尾的换行符,(b) 然后将其拆分为索引数组,以便您可以根据元素在行中占据的可预测位置将其从中取出。
您还可以输入:
Header = readline(a);
Run Code Online (Sandbox Code Playgroud)
如果您想专门提取文件头,则在打开文件后立即运行上述循环。或者,您可以使用enumerate()over eachline(a),然后对枚举的索引执行逻辑(例如,当索引 = 1 时定义标头)。
但请注意,这会比 Daycaster 的答案慢,因此只有当您确实需要额外的灵活性时才值得。