我有一个包含字符串的单元格数组,名为old_array
。每个元素都以后缀' .dat'结尾。我想创建一个名为new_array
的新单元格数组,它具有相同的元素,但没有这个后缀。
我知道存在以下功能:
[new_array] = arrayfun(func, old_array)
但是我对func
使用了什么?我考虑使用strsplit(str, '.')
并获取此数组的第一个元素,如:
[new_array] = arrayfun(strsplit(*, '.')[0], old_array)
但是我应该放置什么而不是*
?什么是最好的解决方案?
答案 0 :(得分:1)
如果数组中的每个元素以.dat
结尾,为什么不简单地提取单元格数组中每个字符串的最后4个字符以外的所有字符?< / p>
new_array = cellfun(@(x) x(1:end-4), old_array, 'UniformOutput', false);
这应该返回一个存储在new_array
中的新单元格数组,其中每个元素从单元格数组old_array
中丢失每个字符串的最后4个字符,这是每个字符串的字符串.dat
在old_array
。
但是,如果您想要使其更加强大,并且如果您想要容纳任何文件名,则可以使用strsplit
,就像您在帖子中所拥有的那样。你必须像这样构造它:
%// Use to split up the strings for each cell and store in individual cells
new_array_temp = cellfun(@(x) strsplit(x, '.'), old_array, 'UniformOutput', false);
%// Extract the first cell of each nested cell
new_array = cellfun(@(x) x{1}, new_array_temp, 'UniformOutput', false);
我们需要做第一步,以便我们可以返回一个单元格的单元格。较大的单元格数组中的每个嵌套单元格将包含由嵌套单元格元素中的.
分隔的字符串。然后运行下一个命令,以便我们提取每个嵌套单元格的第一个字符串,这是.
之前的文件名。
以下是一个示例,向您展示如何运行此示例以及中间输出:
old_array = {'Hi.dat', 'how.dat', 'are.dat', 'you.dat'};
new_array_temp = cellfun(@(x) strsplit(x, '.'), old_array, 'UniformOutput', false);
celldisp(new_array_temp);
new_array_temp{1}{1} =
Hi
new_array_temp{1}{2} =
dat
new_array_temp{2}{1} =
how
new_array_temp{2}{2} =
dat
new_array_temp{3}{1} =
are
new_array_temp{3}{2} =
dat
new_array_temp{4}{1} =
you
new_array_temp{4}{2} =
dat
new_array = cellfun(@(x) x{1}, new_array_temp, 'UniformOutput', false);
disp(new_array);
'Hi' 'how' 'are' 'you'
注意:strsplit
仅适用于MATLAB R2013a及更高版本。如果您希望这与以前版本的MATLAB一起使用,请使用regexp
。用以下内容替换strsplit
内的cellfun
来电:
new_array_temp = cellfun(@(x) regexp(x, '\.', 'split'), 'UniformOutput', false);
这基本上应该与strsplit
达到同样的效果。但是,如果您真的,真的,真的,真的想要使用strsplit
,那么MathWorks文件交换中就会有一个实现:http://www.mathworks.com/matlabcentral/fileexchange/21710-string-toolkits/content/strings/strsplit.m