我有两个单元格:
Months1 = {'F','G','H','J','K','M','N','Q','U','V','X','Z'};
Months2 = 2009:2014;
如何在不运行循环的情况下生成所有组合,以便实现以下目的:
Combined = {'F09','F10','F11','',...,'G09',.....};
基本上Months1
和Months2
的所有组合都在meshgrid
中。
答案 0 :(得分:3)
如果您不需要单元格并且只能使用char数组,则可以使用:
Months1 = ['F','G','H','J','K','M','N','Q','U','V','X','Z']';
Months2 = num2str((2009:2014)');
[x, y] = meshgrid(1:12, 1:6);
Combined = strcat(Months1(x(:)), Months2(y(:),:));
然后,如果需要,您可以reshape
。不过,我还不确定如何用细胞做到这一点。
灵感来自this帖子。
答案 1 :(得分:3)
我对这个问题的看法将适用ndgrid
,datestr
(处理任何一千年)和strcat
来完成这项工作:
yearStrings = datestr(datenum(num2str(Months2(:)),'yyyy'),'yy');
[ii,jj] = ndgrid(1:numel(Months2),1:numel(Months1));
Combined = strcat(Months1(jj(:)).',yearStrings(ii(:),:)).'
注意:年份的变化速度比带前缀字母的速度要快,因此Months2
先于ndgrid
,然后是Months1
。 IMO,this is more intuitive behavior than meshgrid
,迫使你在x,y空间思考,以预测输出的变化。
或者代替strcat
行:
tmp = [Months1(jj(:)).',yearStrings(ii(:),:)].';
Combined = cellstr(reshape([tmp{:}],[],numel(ii)).').'
答案 2 :(得分:2)
您可以将单元格数组转换为grp2idx
的索引,然后使用meshgrid
,然后使用strcat
来组合字符串。在您还需要将数字Months2
向量转换为字符串的单元格数组之前。
[id1,id2] = meshgrid(grp2idx(Months1),Months2);
Months2cell = cellstr(num2str(id2(:)-2000,'%02d'))';
Combined = strcat( Months1(id1(:)), Months2cell );