从保存在“中”的文件中读取matlab中的矩阵;stdout";总体安排
我有一个带有大矩阵打印输出的文件,格式与打印到MATLAB控制台时的格式相同,即文件以从保存在“中”的文件中读取matlab中的矩阵;stdout";总体安排,matlab,io,Matlab,Io,我有一个带有大矩阵打印输出的文件,格式与打印到MATLAB控制台时的格式相同,即文件以 dum = Columns 1 through 11: 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0
dum =
Columns 1 through 11:
0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000
0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000
0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000
0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000
0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000
0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000
一直这样,直到整个矩阵打印出来。我可以使用grep
和wc
等工具了解矩阵的一些情况,因此它并非完全未知,但如果没有这些工具和一些手动计算,我就没有元数据
有没有比用fscan分析文件更简洁的方法将这个矩阵读入MATLAB?在查看了MATLAB中的文件读取实用程序后,我决定不使用它们中的任何一个,取而代之的是一个小的shell脚本,它获取原始文件并以常规ASCII格式重新编写,我可以使用MATLAB中的
loadnewfile
加载它
完整的脚本(不同部分的解释如下):
好的,这是很多正则表达式。我会第一个承认这不是一个优雅的解决方案,但它是有效的
第一个grep
取出所有显示“X到Y列:”的行:
sed
中使用的下一个正则表达式将删除除每行最后一个数字以外的所有内容:
$ grep -e 'Col' stupiddump.txt | sed 's/ Columns [0-9]* through \([0-9]*\):/\1/'
11
22
33
44
55
65
这允许我们一次只搜索其中一个集合。因此,我们将这个漂亮的小脚本包装在backticks中,并循环遍历结果:
$ for n in `grep -e 'Col' stupiddump.txt | sed 's/ Columns [0-9]* through \([0-9]*\):/\1/'`; do
echo "The number is $n";
end
The number is 11
The number is 22
The number is 33
The number is 44
The number is 55
The number is 65
循环中的第一个命令将拾取数据文件的相关部分:
$ pcregrep --multiline "$n:\\n\\s*\\n([\\d\\.\\s]+)" stupiddump.txt
Columns 1 through 11:
0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000
0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000
0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000
etc...
1.10000 1.10000 1.10000 1.10000 1.10000 1.10000 1.10000 1.10000 1.10000 1.10000 1.10000
Columns 12 through 22:
我必须使用pcegrep
才能使用多行regexp。我们将其传输到的sed
s会将周围的文本行替换为零,因此唯一剩下的是实际的矩阵内容:
$ pcregrep --multiline "$n:\\n\\s*\\n([\\d\\.\\s]+)" stupiddump.txt | sed '/\s*Colu.*/d' | sed '/^$/d'
0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000
0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000
0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000
etc...
1.10000 1.10000 1.10000 1.10000 1.10000 1.10000 1.10000 1.10000 1.10000 1.10000 1.10000
我们将此输出重定向到一个名为“$n.out”
的文件中,这样循环完成后,我们就有一组名为11.out
、22.out
等的文件,其中包含相应的列集
最后,我们使用paste
水平连接这些文件,并删除临时文件。在这种情况下,我很幸运,不必担心排序问题,因为数字和词汇排序是相同的,但是如果您有一个列编号不具有相同位数的文件,那么您可能必须对此采取一些明智的措施
$ paste *.out > betterdump.txt && rm *.out
现在,
betterdump.txt
的格式与我键入save-ascii A
首先保存矩阵时的格式大致相同,因此,我可以通过load
轻松阅读,这些是您可以采取的步骤,将此类数据导入到matlab中,而无需对可用函数进行过多挖掘:
filename = 'U:\MATLAB\dum.txt';
delimiter = ' ';
startRow = 3;
formatSpec = '%f%f%f%f%f%f%f%f%f%f%f%[^\n\r]';
fileID = fopen(filename,'r');
textscan(fileID, '%[^\n\r]', startRow-1, 'ReturnOnError', false);
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'ReturnOnError', false);
fclose(fileID);
dum = [dataArray{1:end-1}];
clearvars filename delimiter startRow formatSpec fileID dataArray ans;
使用此代码或对其进行修改以使其更方便应该不难。请查看dlmread或textscan。即使矩阵中的列数超过一个“集合”中的列数,此操作是否有效,也就是说,下面还有一行,第12列到第22列:等等?@TomasLycken在这种情况下,您可能希望首先将其作为单元格数组(而不是矩阵)导入,然后再进行一些后处理。
$ paste *.out > betterdump.txt && rm *.out
filename = 'U:\MATLAB\dum.txt';
delimiter = ' ';
startRow = 3;
formatSpec = '%f%f%f%f%f%f%f%f%f%f%f%[^\n\r]';
fileID = fopen(filename,'r');
textscan(fileID, '%[^\n\r]', startRow-1, 'ReturnOnError', false);
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'ReturnOnError', false);
fclose(fileID);
dum = [dataArray{1:end-1}];
clearvars filename delimiter startRow formatSpec fileID dataArray ans;