Matlab中单元数组的高效分配

3

我有一些代码,用于将一个字符串的单元数组转换为一个字符的单元数组。

注意:由于多种原因,输入(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(1,1:12)

ans = 

Columns 1 through 12

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

所以您有一个字符串的单元数组。您的目标是将每个字符串转换为字符的单元数组,其中该单元数组中的每个元素都是一个单独的字符吗? - rayryeng
是的,每行包含原始数组中同一行的各个字符。 - Doragan
1个回答

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表示我们想要每个元素打印一个单独字符。如果您想了解更多信息,请查看我上面发布的Undocumented 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中的前三个单元格组成的三个元素的单元格数组。


这段代码看起来不错,但是当我运行它时,我目前遇到了内存不足的问题。 - Doragan
@Doragan - 每个字符串有多少个字符?如果每个字符串平均大约有1000个字符,并且您有28000行,则可能很快就会耗尽内存。这并不能解释为什么您的其他代码可以工作。在再次运行代码之前尝试执行clear all;?此外,如果您不打算再使用C,请考虑在循环结束时将每个条目置为空,因此执行C{i} = []; - rayryeng
1
很棒的函数!稍后再用。 - sco1
@Doragan - 这很奇怪...好的!请告诉我进展如何! - rayryeng
@rayryeng 我已经将你的示例更改为 C_itemised{i,1:length(C(i))} = sprintfc('%c', C{i});,这似乎给出了正确的输出,但仍然遇到了内存问题。工作还在继续... - Doragan
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接