Читайте с подвыборкой в MATLAB
Есть ли способ читать с подвыборкой в MATLAB? Входные данные выглядят так:
id=3,age=25, 0.5 0.5 0.2 0.6 0.6 0.5
id=1,age=15, 0.5 0.8 0.2 0.9 0.6 0.9
id=7,age=24, 0.5 0.2 0.9 0.6 0.1 0.5
(Отредактировано) Для столбцов LAST SIX мне нужны только столбцы, кратные трем (т.е. 3-й столбец и 6-й столбец в столбцах LAST SIX, что эквивалентно 5-му столбцу и 8-му столбцу во всем файле данных) быть прочитанным То есть матрица типа:
0.2 0.5
0.2 0.9
0.9 0.5
В идеале код выглядит так:
for line=1:maxLine
header(line,:) = fscanf(fid,'id=%d,age=%d,',[1,2]);
content(line,:) = fscanf(fid,'only read columns multiple of three');
end;
Я знаю, что могу прочитать всю строку и подвыборку, проблема в том, что массив, с которым я имею дело, имеет большой масштаб, 10 тыс. + Столбцов, я не хочу использовать слишком много памяти.
1 ответ
Есть способ: если вы используете fopen
вы можете получить доступ к файлу только один раз, поэтому вы не можете сделать это в цикле. Таким образом, вам нужно загрузить все необходимые данные в один массив, а затем транспонировать его. Ваше желание сохранить свободную память достигается за счет игнорирования некоторых элементов:
fid = fopen('new.txt','r');
A = fscanf(fid, 'id=%d,age=%d, %*f %*f %f %*f %*f %f\n', [4 inf])
Я использовал ваши данные и получил такой результат:
A =
3.0000 1.0000 7.0000
25.0000 15.0000 24.0000
0.2000 0.2000 0.9000
0.5000 0.9000 0.5000
как вы можете прочитать здесь http://www.mathworks.com/help/matlab/ref/fscanf.html?searchHighlight=fscanf fscanf
читает данные в столбцы, поэтому нам нужно их транспонировать. Итак, используя A=A'
дает желаемый результат:
A =
3.0000 25.0000 0.2000 0.5000
1.0000 15.0000 0.2000 0.9000
7.0000 24.0000 0.9000 0.5000
Теперь вы можете сделать две разные матрицы, если это необходимо.