我想用一个大字符串做一个单元格数组,例如我有:
str1 = ['aa1','bb1','cc1'];
str2 = ['aa2','bb2','cc2'];
问题是如何制作每个逗号分隔的字符串条目,单独的单元格数组条目。我正在寻找类似
的东西dataCell = {eval(str1),';', ...
eval(str2)};
最后,我希望得到以下内容:
dataCell = {'aa1','bb2','cc2'; 'aa2','bb2','cc2'}
我可以绕过循环并执行类似
的操作dataCell {end+1} = 'string';
但如果可能的话,我想立刻做一切。
提前致谢。
PS问题是,哪种解决方案在性能方面最佳?
答案 0 :(得分:4)
我喜欢这些问题,因为它可以向你展示各种不同的方法来做同样的事情:
str1=['aa1';'bb1';'cc1'];
str2=['aa2';'bb2';'cc2'];
data = [cellstr(str1) cellstr(str2)]'
data =
'aa1' 'bb1' 'cc1'
'aa2' 'bb2' 'cc2'
再次假设str1和str2被;
分开。
答案 1 :(得分:1)
首先,我想指出str=['aa1','bb1','cc1'];
是一个char变量,它由连接的三个字符串组成(而不是str=['aa1';'bb1';'cc1'];
,这是一个3乘1的char数组)。
假设您打算使用char数组,那么您可以使用函数mat2cell
从char数组构建单元数组:
str1=['aa1';'bb1';'cc1'];
str2=['aa2';'bb2';'cc2'];
dataCell1=mat2cell(str1,ones(1,size(str1,1)),size(str1,2));
dataCell2=mat2cell(str2,ones(1,size(str2,1)),size(str2,2));
dataCell=[dataCell1 dataCell2]';
它为您提供以下单元格数组:
'aa1' 'bb1' 'cc1'
'aa2' 'bb2' 'cc2'
UPDATE :当你似乎关注性能时,我进行了一些测试来比较n×n字符数组中单元格数组的构建时间。这不是一个精确的基准,但它给出了有趣的结果。
n=5;
Elapsed time is 0.008 seconds for mat2cell.
Elapsed time is 0.002 seconds for cellstr
Elapsed time is 0.0003 seconds for the loop.
n=500;
Elapsed time is 0.015 seconds for mat2cell.
Elapsed time is 0.005 seconds for cellstr.
Elapsed time is 0.0015 seconds for the loop.
n=5000;
Elapsed time is 0.64 seconds for mat2cell.
Elapsed time is 0.20 seconds for cellstr.
Elapsed time is 0.16 seconds for the loop.
如果你想测试它(或纠正我可能的错误),我就是这样做的:
clear all;
n=500;
str=[repmat('a',1,n)];
strarray=repmat(str,n,1);
tic;
strcell=mat2cell(strarray,ones(1,size(strarray,1)),size(strarray,2));
toc;
clear all;
n=500;
str=[repmat('a',1,n)];
strarray=repmat(str,n,1);
tic;
strcell=cellstr(strarray);
toc;
clear all;
n=500;
str=[repmat('a',1,n)];
strarray=repmat(str,n,1);
tic;
strcell=cell(size(strarray,1),1);
for i=1:size(strarray,1)
strcell{i}=strarray(i,:);
end
toc;
答案 2 :(得分:0)
我猜你的意思是
str1 = ['aa1';'bb1';'cc1'];
str2 = ['aa2';'bb2';'cc2'];
否则你只需为每个变量获得一个向量。 在这种情况下,您应该使用:
mat2cell([str1;str2],ones(1,6),3)