Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从保存在“中”的文件中读取matlab中的矩阵;stdout";总体安排_Matlab_Io - Fatal编程技术网

从保存在“中”的文件中读取matlab中的矩阵;stdout";总体安排

从保存在“中”的文件中读取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

我有一个带有大矩阵打印输出的文件,格式与打印到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.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中,而无需对可用函数进行过多挖掘:

  • 右键单击matlab内部的文件
  • 单击导入数据
  • 选择矩阵
  • 设置范围A3:K6(或文件结束的位置)
  • 单击导入,或单击生成代码
  • 由此,您将得到如下代码:

    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;