2015-09-23 2 views
-1

Есть ли все-таки, чтобы читать с подвыборкой в ​​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

(Edited) в течение последних шести колонок, я хочу только столбцы, которые кратны трем (то есть 3-й колонны, а 6-й столбец в LAST SIX COLUMNS, который эквивалентен 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; 

Я знаю, что я могу прочитать всю строку и sub-sample, проблема в том, что массив, с которым я имею дело, имеет большой масштаб, 10k + столбцы, я не хочу потреблять слишком m uch память.

+0

Что вы подразумеваете под «несколькими из трех»? '0,2' и' 0,5' не делятся на 3, а единственное число, которое появляется 3 раза в любой строке или столбце, равно '0,5'. – IKavanagh

ответ

0

Существует способ: , если вы используете 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=fscanffscanf считывает данные в столбцы, которые поэтому нам нужно транспонировать его. Таким образом, использование 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 

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

+0

Я считаю, что я могу использовать for-loop в моде 'for i = 1: DataLine \ n A (i, :) = fopen (fid, 'format', [1 6]); \ n end; ' – user3813057

+0

Я не пробовал эту версию. Но вы не можете использовать 'fopen' для чтения данных. Похоже, вы допустили ошибку и означали 'fscanf'. Это? если это так, я пробовал некоторые версии циклов и уже писал вам - я столкнулся с проблемой - 'fopen' правильно работает только один раз. Если я использовал его в цикле, мне пришлось использовать 'fopen' каждую итерацию, но затем он читался с начала файла. Если вы можете решить это, дайте мне знать! –

+0

Это опечатка. Я имею в виду «fopen» вне цикла и 'fscanf' внутри цикла. Спасибо за показ использования '% * f'. Я этого никогда не знаю. Проблема в том, что у нас есть столбцы 10k +, и мы не можем писать '% * f' тысячи раз. Нам нужно использовать итерацию для чтения элементов. – user3813057

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