Matlab输入格式
Matlab input format
我有包含以下格式数据的输入文件。
65910/A
22 9 4 2
9 10 4 1
2 5 2 0
4 1 1 0
65910/T
14 7 0 4
8 4 0 2
1 2 0 0
1 1 1 1
.
.
.
我需要输入第一行是 %d
和 %c
的组合,中间有一个 /
,接下来的四行是 4x4
整数矩阵。我需要对矩阵执行一些操作,然后使用 header 信息识别它们。
如何在 MATLAB 中采用这种输入格式?
由于您的文件包含可能被视为结构化的数据(或 "formatted",如果使用 MATLAB 的术语),您可以使用 textscan
函数读取其内容。这个函数的主要优点是你不需要指定你的 "header+data" 结构出现了多少次——这个函数会一直运行直到它到达文件的末尾。
给定一个具有以下结构的输入文件(我们称之为 q35853578.txt
):
65910/A
22 9 4 2
9 10 4 1
2 5 2 0
4 1 1 0
65910/T
14 7 0 4
8 4 0 2
1 2 0 0
1 1 1 1
我们可以这样写:
function [data,headers] = q35853578(filepath)
%// Default input
if nargin < 1
filepath = 'q35853578.txt';
end
%// Define constants
N_ROWS = 4;
VALS_PER_ROW = 4;
NEWLINE = '\r\n';
%// Read structured file contents
fid = fopen(filepath);
headers = textscan(fid,['%u/%c' repmat([NEWLINE repmat('%u',1,VALS_PER_ROW)],1,N_ROWS)]);
fclose(fid);
%// Parse contents and prepare outputs
data = cell2mat(reshape(cellfun(@(x)reshape(x,1,1,[]),headers(3:end),...
'UniformOutput',false),VALS_PER_ROW,N_ROWS).'); %'
headers = headers(1:2);
%// Output checking
if nargout < 2
warning('Not all outputs assigned, some outputs will not be returned!')
end
%// Debug
clear ans fid N_ROWS NEWLINE VALS_PER_ROW filepath
keyboard; %// For debugging, delete/comment when done.
结果输出是 uint32
的 3d 数组(输出 class 可以通过将输入调整为 textscan
来更改,这是 formatSpec
允许的):
ans(:,:,1) =
22 9 4 2
9 10 4 1
2 5 2 0
4 1 1 0
ans(:,:,2) =
14 7 0 4
8 4 0 2
1 2 0 0
1 1 1 1
我有包含以下格式数据的输入文件。
65910/A
22 9 4 2
9 10 4 1
2 5 2 0
4 1 1 0
65910/T
14 7 0 4
8 4 0 2
1 2 0 0
1 1 1 1
.
.
.
我需要输入第一行是 %d
和 %c
的组合,中间有一个 /
,接下来的四行是 4x4
整数矩阵。我需要对矩阵执行一些操作,然后使用 header 信息识别它们。
如何在 MATLAB 中采用这种输入格式?
由于您的文件包含可能被视为结构化的数据(或 "formatted",如果使用 MATLAB 的术语),您可以使用 textscan
函数读取其内容。这个函数的主要优点是你不需要指定你的 "header+data" 结构出现了多少次——这个函数会一直运行直到它到达文件的末尾。
给定一个具有以下结构的输入文件(我们称之为 q35853578.txt
):
65910/A
22 9 4 2
9 10 4 1
2 5 2 0
4 1 1 0
65910/T
14 7 0 4
8 4 0 2
1 2 0 0
1 1 1 1
我们可以这样写:
function [data,headers] = q35853578(filepath)
%// Default input
if nargin < 1
filepath = 'q35853578.txt';
end
%// Define constants
N_ROWS = 4;
VALS_PER_ROW = 4;
NEWLINE = '\r\n';
%// Read structured file contents
fid = fopen(filepath);
headers = textscan(fid,['%u/%c' repmat([NEWLINE repmat('%u',1,VALS_PER_ROW)],1,N_ROWS)]);
fclose(fid);
%// Parse contents and prepare outputs
data = cell2mat(reshape(cellfun(@(x)reshape(x,1,1,[]),headers(3:end),...
'UniformOutput',false),VALS_PER_ROW,N_ROWS).'); %'
headers = headers(1:2);
%// Output checking
if nargout < 2
warning('Not all outputs assigned, some outputs will not be returned!')
end
%// Debug
clear ans fid N_ROWS NEWLINE VALS_PER_ROW filepath
keyboard; %// For debugging, delete/comment when done.
结果输出是 uint32
的 3d 数组(输出 class 可以通过将输入调整为 textscan
来更改,这是 formatSpec
允许的):
ans(:,:,1) =
22 9 4 2
9 10 4 1
2 5 2 0
4 1 1 0
ans(:,:,2) =
14 7 0 4
8 4 0 2
1 2 0 0
1 1 1 1