Загрузить файл с несколькими марксами в Matlab - PullRequest
1 голос
/ 03 апреля 2012

У меня есть файл, который содержит несколько числовых матриц. Все матрицы разделены новой строкой, как показано в примере ниже:

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 ]

1 голос
/ 04 апреля 2012

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

В результате вы получите массив ячеек 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);

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

0 голосов
/ 04 апреля 2012

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

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

n = 3% количества матриц

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


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


г = 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);                
0 голосов
/ 03 апреля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...