我有一些将字符串的单元格数组转换为字符的单元格数组。
请注意。由于多种原因,输入(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' []
答案 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
中的前三个单元格组成。