【问题标题】:MATLAB: Simple cellfun does not work on string vectorMATLAB:简单的 cellfun 不适用于字符串向量
【发布时间】:2015-02-11 01:36:06
【问题描述】:

我这样构建了我的向量:

v = ['asdf'; 'qwer'; 'zxcv'];

我只是想取前两个字符,我写了一个简单的cellfun,如下所示:

A = cellfun(@(x) x(1:2), v, 'UniformOutput', false);

但是,它说:

error: cellfun: C must be a cell array

我应该如何提取每个字符串的前 2 个字符?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    这是因为v 不是元胞数组。合二为一:

    v = {'asdf'; 'qwer'; 'zxcv'};
    

    如果您不能使用元胞数组,请按照 Divakar 的建议进行操作,并使用 cellstrv 合二为一:

    v = ['asdf', 'qwer', 'zxcv'];
    v_cell = cellstr(v);
    

    如果您想转义临时变量,请将带有v 的调用直接提供给cellfun

    A = cellfun(@(x) x(1:2), cellstr(v), 'UniformOutput', false);
    

    如果您想取消-单元格数组,请使用cell2mat

    Aout = cell2mat(A);
    

    不过,我质疑上述方法的效率。如果您只想提取元胞数组的前两个字符然后将其转回字符数组,为什么不简单地索引原始字符中所有行的前两列大批?当简单的索引可以解决问题时,使用cellfun 会增加不必要的开销。在这种情况下,索引比使用cellfun 更具可读性,后者增加了一层混淆。

    Aout = v(:,1:2);
    

    【讨论】:

    • 我不能把它变成一个元胞数组。向量 v 必须保持原样。还有其他方法吗?
    • @Mariska 尝试v_cell = cellstr(v),然后在cellfun 调用中使用v_cell
    • @Mariska - 如果不能使用元胞数组,为什么还要使用cellfun?是的,按照 Divakar 所说的去做,并使用 cellstr
    • @rayryeng 再做一张脸! ;) 好吧bsxfun 也有!!
    • 哈哈让我想到了这个......这实际上可能是一个最小的完整和可验证的 XY 问题示例! :D 我很想收藏这篇文章嘿嘿!
    猜你喜欢
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    相关资源
    最近更新 更多