在Matlab中实现而非结构的有效方式

时间:2011-12-19 20:16:02

标签: matlab structure

我正在读取csv或文本文件中的一些数据(由几千行组成,每行包含固定数量的列 - 例如:20)。

我在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;

从csv / text文件中填写firstsecthirval1val2。 除了timescan之外,还有多个字段可用,但我没有将它们包含在此处。

在运行程序时,我收到警告

  

变量initial_var似乎在每次循环迭代时都会改变大小。考虑预先分配速度。

我知道这可以通过预先分配和初始化来解决。

但我的问题是,保留上述数据而不是上述结构类型的更好方法是什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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.

如果数据都是数字,那么存储和操作简单矩阵的速度最快。

此外,如果您发布一些特定数据和可重现的代码,我们可能会提供更具体的答案......