2011-12-19 3 views
0

Я читаю некоторые данные из CSV или текстового файла (который состоит из тысяч строк с каждой строкой, состоящей из фиксированного числа столбцов - например, 20).Эффективный способ реализации, а не структуры в Matlab

Я сохраняю вышеуказанные детали в Matlab со структурой следующим образом.

initial_var(firs).second_var(sec).third_var(thir).time(end+1, :) = []; 
initial_var(firs).second_var(sec).third_var(thir).scan(end+1, :) = []; 

initial_var(firs).second_var(sec).third_var(thir).time(end+1, :) = val1; 
initial_var(firs).second_var(sec).third_var(thir).scan(end+1, :) = val2; 

где first, sec, thir, val1, val2 заполняются из CSV/текстового файла. Существует несколько полей, кроме time и scan, но я не включил их здесь.

Во время работы программы, я получаю предупреждение

Переменная initial_var появляется, чтобы изменить размер на каждой итерации цикла. Подумайте о предварительном распределении скорости.

Я знаю, что это может быть разрешено путем предварительного распределения и инициализации.

Но мой вопрос здесь в том, что является лучшим способом сохранить вышеуказанные данные, а не вышеупомянутый тип структуры?

ответ

0

Как правило, самый быстрый и гибкий способ считывания данных - fscanf. (Смотрите также csvread для удобства обертки для CSV-файлов). Например:

data = randn(1e4, 20); 
save data.txt data -ASCII 

tic 
h = fopen('data.txt') 
data_read = fscanf(h, '%f'); 
data_read = reshape(data_read, 1e4, []); 
toc 
Elapsed time is 0.089097 seconds. 

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

Кроме того, если вы разместите некоторые конкретные данные и воспроизводимый код, мы могли бы быть в состоянии дать более конкретные ответы ...

1

Эти линии не будут делать ничего:

initial_var(firs).second_var(sec).third_var(thir).time(end+1, :) = []; 
initial_var(firs).second_var(sec).third_var(thir).scan(end+1, :) = []; 

Это означает, что " удалите строку после конца этого массива ».

Вы хотели бы посмотреть на многомерную структуру:

vars(firs,sec,thr).time(end+1, :) = val1 
vars(firs,sec,thr).scan(end+1, :) = val2 

Должен быть проще инициализация тоже.

Кроме того, при загрузке данных вы можете посмотреть textscan.

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