将字符数组拆分成单元格的最有效方法?

时间:2014-08-04 13:31:31

标签: matlab

我正在努力重写一个旧的数据处理功能,我有一个优化问题。该功能的主要目的是处理&从* .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格式规范中的textscantextscan在其输出上连接成单个字符数组。因此,对于5000的块大小,该列中textscan的输出是5000x1字符数组(没有分隔符)。我想将其拆分为5000x1单元格数组,但我不确定最有效的方法是什么。

我提出的这一行使用了mat2cellsome_variable = mat2cell(segarray{:,1},ones(length(segarray{:,1}),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矩阵,则该函数会将其“展开”为行单元格数组输出。