我有一些可以将字符串元胞数组转换为字符元胞数组。
注意。由于多种原因,输入 (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' []
最佳答案
我可以建议的一件事是使用未记录的函数 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
中的前三个元胞组成。
关于arrays - matlab中元胞数组的高效分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27153064/