arrays - matlab中元胞数组的高效分配

标签 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'    []

最佳答案

我可以建议的一件事是使用未记录的函数 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/

相关文章:

javascript - .splice() 从数组中移除 2 个对象而不是 1 个

MySQL 更改 EMPTY 表上的列名,需要很长时间

java - 在java中比较两个日期的最佳方法

javascript - Javascript 函数数组或函数包装/嵌套更适合手动/直接 "event"订阅吗?

ios - UICollection 的 IndexPath 到底是什么

2 arraylist 中的 Java 数组

matlab - Matlab的默认显示功能等效于什么,它输出到文件而不是stdout?

matlab - 设置 Matlab eps 图的大小

c++ - 在主函数之前声明具有用户定义大小的数组

MATLAB:从不同的分布生成两个独立的随机变量