Читайте с подвыборкой в ​​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

Теперь вы можете сделать две разные матрицы, если это необходимо.

Другие вопросы по тегам