将multiple-martrix文件加载到Matlab中

时间:2012-04-03 14:52:34

标签: arrays matlab

我有一个包含多个数字矩阵的文件。所有矩阵都用换行符分隔,如下例所示:

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提供了一个简单的加载函数,显然不适用于这种格式。

如果您对如何加载此类文件有任何线索,那将非常有用。

非常感谢

3 个答案:

答案 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)

因此,将文件导入一个矩阵并将其拆分为所需的子矩阵。 uiimportdlmread将执行此操作的第一部分,您必须完成第二部分。

如果您的数据集太大而无法一次性加载并将其复制到其他变量中,那么您必须尝试使用​​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);