我正在努力重写一个旧的数据处理功能,我有一个优化问题。该功能的主要目的是处理&从* .csv文件中编译多达39列1000Hz DAQ数据,因此我正在处理相当大量的数据。
原始函数对文件中的行数“哑”,并简单地将textscan
读入的数据块与现有数组连接。
伪代码示例:
some_variable = [] % initialize
while ~feof(fid)
segarray = textscan(fid, format, chunk_size, 'Delimiter',',');
some_variable = [some_variable segarray{:,1}];
end
效率低下但是当我写这篇文章时我不知道更好。
无论如何,我的新功能利用快速几行Perl(找到over at the MATLAB Newsgroup,我主要在Windows上工作)来计算行数,这样我就可以智能地初始化我的所有数据数组。
这使我的速度显着提高,但发现了一些实施问题,其中一个是我想问的问题。一些列是单个字符字段(%c
格式规范中的textscan
)textscan
在其输出上连接成单个字符数组。因此,对于5000的块大小,该列中textscan
的输出是5000x1
字符数组(没有分隔符)。我想将其拆分为5000x1
单元格数组,但我不确定最有效的方法是什么。
我提出的这一行使用了mat2cell
:some_variable = mat2cell(segarray{:,1},ones(length(segarray{:,1}),1),1)
,它工作得很好,但有更快的方法吗?
答案 0 :(得分:2)
如果您要检查mat2cell
的代码:
edit mat2cell % at Command window
你会发现它很简单:根据维度分配单元格数组,然后用for
循环中的“切片”输入填充单元格。
这表明要制作一个类似的“特殊”功能,只能处理这个问题:
function C = str2cell(S)
N = numel(S);
C = cell(N, 1);
for k = 1:N
C{k} = S(k);
end;
end
我无法想象比这更快的东西...而且,与常识相反,for
循环在MATLAB的最新版本中相当快。
请注意,如果您的S
参数是2D矩阵,则该函数会将其“展开”为行单元格数组输出。