2011-12-19 36 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; 

其中firstsecthirval1val2從CSV /文本文件填充。 除timescan以外,還有多個字段,但我沒有將它們包含在這裏。

在運行程序時,我收到警告

變量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