在matlab中有效分配单元阵列

时间:2014-11-26 15:34:23

标签: arrays matlab performance cell-array

我有一些将字符串的单元格数组转换为字符的单元格数组。

请注意。由于多种原因,输入(C)和输出(C_itemised)都必须是单元阵列。

字符串(C)的单元格数组如下:

>> C(1:10)

ans = 

't1416933446'
''
't1416933446'
''
't1416933446'
''
't1416933446'
''
't1416933446'
''

我这里只展示了一部分数组。实际上它的长度约为28,000行。

我有一些代码可以做到这一点,虽然效率非常低。 cellstr函数占用了代码时间的72%,因为它目前被称为数千次。代码如下:

C_itemised=cell(length(C),500);
for i=3:length(C)
    temp=char(C{i});

    for j=1:length(temp)
        C(i-2,j)=cellstr(temp(j));
    end
end

我觉得一些微小的修改可以取消内循环,从而大大减少整体运行时间。我已经尝试了很多方法来做到这一点,但我想我一直对使用{}或()感到困惑,并且无法在网上找到任何可以帮助我的东西。谁能看到让代码更有效的方法呢?

请注意,此功能与其他功能一起使用,虽然运行速度比理想情况慢,但确实有效。因此,我不希望更改C_itemised

的格式

编辑: (当前函数的输出的一个示例)是:

C_itemised(1,1:12)

ans = 

Columns 1 through 12

't'    '1'    '4'    '1'    '6'    '9'    '3'    '3'    '4'    '4'    '6'    []

1 个答案:

答案 0 :(得分:3)

我可以建议的一件事是使用未记录的函数sprintfc。此函数在MATLAB中不能正常使用,但在内部使用时具有各种其他功能。主要是,如果您尝试help sprintfc,它会说没有找到任何功能!有时嗅到源头很酷!

sprintfc的工作原理是您为其提供格式化字符串,与printf非常相似,以及您要打印的数据。它将采用数据中的每个单独元素并将它们放入单个单元格数组中。例如,假设我有一个字符串D = 'abcdefg';,如果我们这样做:

out = sprintfc('%c', D);

我们得到:

>> celldisp(out)

out{1} =

a


out{2} =

b


out{3} =

c


out{4} =

d


out{5} =

e


out{6} =

f


out{7} =

g

因此,它会将字符串中的每个元素放在一个单独的字符中,作为新单元格数组中的单个元素。 %c格式化字符串意味着我们要为每个元素打印一个字符。如果您想了解更多信息,请查看我在上面发布的未记录MATLAB的链接!


因此,请尝试将循环简化为:

C_itemised=cell(length(C));
for i=1:length(C)
    C_itemised{i} = sprintfc('%c', C{i});
end

C_itemised将是一个单元格数组,其中每个元素C_itemised{i}是另一个单元格数组,此单元格数组中的每个元素都是由字符串C{i}组成的单个字符。


次要注意事项

你说你对MATLAB中的{}()细胞感到困惑。 {}用于访问单元格内的各个元素。因此,例如,C{1}将抓取存储在单元阵列的第一个元素中的任何内容。 ()用于切片并索引到单元格中。例如,如果您想创建另一个单元格数组作为当前单元格的子集,您可以执行C(1:3)之类的操作。这将创建一个三元素单元格数组,由C中的前三个单元格组成。