Прочитать блок данных в матрице Matlab

У меня есть файл данных, который выглядит следующим образом

3 1.0 1.4 1.7
2 1.2 1.5
1 1.1
2 1.1 1.2

Для каждой строки первое целое число указывает число плавающих чисел в этой строке.

Теперь я хочу загрузить все данные в один массив Matlab и игнорировать первый столбец, то есть я хочу получить такой массив, как этот

>>arr = [1.0, 1.4, 1.7, 1.2, 1.5, 1.1, 1.1, 1.2]

если для каждой строки у нас есть такое же число плавающих чисел, я могу просто сделать это так:

>>arr = load datafile ;
>>arr = arr(:,2:end) ; %ignore the first column
>>arr = arr(:) ;

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

Спасибо.

2 ответа

Сначала прочитайте числа как строки:

C = textread('myfile.txt', '%s', 'delimiter', '\n');

Результатом является массив ячеек строк, поэтому применим str2num к каждой ячейке для получения числовых значений:

C = cellfun(@str2num, C, 'Uniform', false);

Теперь отбросьте первый элемент из каждой ячейки:

C = cellfun(@(x)x(2:end), C, 'Uniform', false);

Наконец, мы объединяем все значения в один вектор:

arr = [C{:}]

Это полный код:

C = textread('test.txt', '%s', 'delimiter', '\n'); %// Read data
C = cellfun(@str2num, C, 'Uniform', false); %// Convert to numbers
C = cellfun(@(x)x(2:end), C, 'Uniform', false); %// Remove first values
arr = [C{:}]
arr = 
 1.0000 1.4000 1.7000 1.2000 1.5000 1.1000 1.1000 1.2000


Простым способом сделать это будет просто чтение строки строки за строкой

fid = fopen('data.txt');
arr = [];
tline = fgetl(fid);
while (tline ~= -1)
 temp = str2num(tline);
 arr = [arr temp(2:end)];
 tline = fgetl(fid);
end

Вы также можете попробовать использовать функцию loadcell, хотя я не пробовал ее, поэтому я не уверен, что она сработает для вас.

licensed under cc by-sa 3.0 with attribution.