2011-12-19 71 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