我目前正在重写我的一个旧的数据处理函数,我有一个优化问题。该函数的主要目的是处理和编译来自*.csv文件的多达39列1000 large数据,因此我要处理大量的数据。
原始函数对文件中的行数“哑”,只需将textscan读取的数据块与现有数组连接起来。
示例伪码:
some_variable = [] % initialize
while ~feof(fid)
segarray = textscan(fid, format, chunk_size, 'Delimiter',',');
some_variable = [some_variable segarray{:,1}];
end令人痛苦的是,效率低下,但当我写的时候,我不知道更好。
总之,我的新函数利用了一对快速的Perl行(找到了在MATLAB新闻组,我主要在Windows上工作)来计数行数,这样我就可以智能地初始化所有数据数组。
这使我的速度有了很大的提高,但也暴露了一些实现问题,其中之一就是我想问的问题。其中一些列是单个字符字段(%c在textscan格式规范中),textscan在输出时将其连接到单个字符数组中。因此,对于大小为5000的块,该列中的textscan输出是一个5000x1字符数组(没有分隔符)。我想把它分割成一个5000x1单元数组,但是我不知道最有效的方法是什么。
我想出了用过的mat2cell:some_variable = mat2cell(segarray{:,1},ones(length(segarray{:,1}),1),1),它工作得很好,但是有更快的方法吗?
发布于 2014-08-04 14:10:43
如果您要检查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我无法想象比这更快的东西..。而且,与常识相反,在MATLAB的最后一个版本中,for循环速度相当快。
请注意,如果您的S参数是2D矩阵,则该函数将将其“解压”到一行单元格数组输出。
https://stackoverflow.com/questions/25119898
复制相似问题