我有一个包含多个数字矩阵的文件。所有矩阵都用换行符分隔,如下例所示:
0,-1,18
1,2,1
2,-1,7
3,-1,12
4,-1,7
5,-1,23
6,-1,18
7,-1,10
5,-1,23
8,2,9
9,2,8
15,-1,1
128,-1,7-
174,-1,8
175,-1,0
176,-1,7-
我想将此文件加载到Matlab工作空间中,以便将每个矩阵分配给不同的变量。
Matlab提供了一个简单的加载函数,显然不适用于这种格式。
如果您对如何加载此类文件有任何线索,那将非常有用。
非常感谢
答案 0 :(得分:1)
下面的代码用TEXTSCAN读取所有行,用空行将它们拆分成单独的矩阵,然后转换为double。
因此,您将单个数组作为单个单元格获得单元数组out
。例如,要访问第一个矩阵,请使用out{1}
等。这比单个变量更好。
%# open file and read all lines
fid = fopen('test6.txt','rt');
temp = textscan(fid, '%s', 'delimiter', '\n');
temp = [temp{:}];
fclose(fid);
%# find empty lines
idxSep = find(cellfun(@isempty, temp));
%# separate matrices to different cells
temp2 = mat2cell(temp, diff([0; idxSep; numel(temp)]), 1);
%# remove empty lines
temp2(1:end-1) = cellfun(@(x) x(1:end-1), temp2(1:end-1), 'UniformOutput',0);
%# convert cell arrays to double
out = cell(size(temp2));
for k = 1:numel(temp2)
out{k} = cellfun(@str2num, temp2{k}, 'UniformOutput',0);
end
out = cellfun(@cell2mat, out, 'UniformOutput', 0);
我可能错过了让代码更简单的东西。欢迎任何建议。
答案 1 :(得分:0)
因此,将文件导入一个矩阵并将其拆分为所需的子矩阵。 uiimport
或dlmread
将执行此操作的第一部分,您必须完成第二部分。
如果您的数据集太大而无法一次性加载并将其复制到其他变量中,那么您必须尝试使用textscan
或类似的函数来读取文件分块。
答案 2 :(得分:0)
这是我的解决方案
我将文件更改为以下格式:
n = 3%的矩阵数
r =当前矩阵中原始数量的3%
0 -1 18
1 2 1
2 -1 7
R = 3
3 -1 12
4 -1 7
5 -1 23
R = 5
6 -1 18
7 -1 10
5 -1 23
8 2 9
9 2 8
我实现了以下简单的功能
function data = load_sparse_data(filename) % open the file fid = fopen(filename); % find N (The total number of matrices) N = fscanf(fid, 'n=%d\n', 1); % read each matrix for n = 1:N % skip line fscanf(fid, '\n', 1); % find R, the number of raws R = fscanf(fid, 'r=%d\n', 1); % fscanf fills the array in column order, % so transpose the results data(n).mat = ... fscanf(fid, '%f', [3, R])'; % skip line fscanf(fid, '\n', 1); end %cloes the file fclose(fid);