2012-04-03 4 views
1

У меня есть файл, содержащий несколько числовых матриц. Все матрицы разделяются символом новой строки, как показано в примере ниже:Загрузите файл с несколькими картами в 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 обеспечивает простую функцию загрузки, которая, по-видимому, не работает для такого формата.

Было бы очень полезно, если у вас есть ключ к загрузке такого файла.

Большое спасибо

ответ

0

Так импортировать файл в одну матрицу и разделить его на подклассы матриц, которые вы хотите. uiimport или dlmread сделают первую часть этого, вам придется сделать вторую часть.

Если ваш набор данных настолько велик, что вы не можете загрузить его все сразу и скопировать его в другие переменные, вам придется поэкспериментировать с textscan или другими подобными функциями, чтобы прочитать файл в кусках.

0

Вот мое решение

Я изменил файл в следующем формате:

п = 3% числа матриц

г = 3% количество баранами в текущей матрице
0 -1 18
2 -1 7


г = 3
3 -1 12
4 -1 7
5 -1 23


г = 5
6 -1 18
7 -1 10
5 -1 23


И я реализовал следующую простую функцию

 
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);     
1

Код ниже считывает все строки с TextScan, разбивает их на отдельные матрицы пустыми строками, а затем преобразует в два раза.

В результате вы получаете массив ячеек out с двойными матрицами в виде отдельных ячеек. Например, для доступа к 1-й матрице используйте 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); 

Возможно, я пропустил что-то, чтобы сделать код более простым. Любые предложения приветствуются.

Смежные вопросы