Matlab 从str连接创建数组

Matlab 从str连接创建数组,matlab,for-loop,concat,Matlab,For Loop,Concat,你好,我有这两个向量 Q = [1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4] 及 我想把它们连接成一个数组 Time = [20001,20002,20003,20004,20010....] 或 到目前为止,我尝试了这个代码 m = zeros(136,1) for i=1:136 m(i,1)= strcat(Q(i),Year(i)); end Matlab向我输出了这个: 下标赋值维度不匹配 请帮

你好,我有这两个向量

Q = [1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4]

我想把它们连接成一个数组

Time = [20001,20002,20003,20004,20010....]

到目前为止,我尝试了这个代码

  m = zeros(136,1)
  for i=1:136
           m(i,1)= strcat(Q(i),Year(i));
  end
Matlab向我输出了这个:

下标赋值维度不匹配


请帮助?

您可以使用
arrayfun

如果希望输出为字符串格式(中间有一个
'Q'
),则使用
sprintf
格式化字符串

Time = arrayfun( @(y,q) sprintf('%dQ%d', y, q ), Year, Q, 'uni', 0 );
产生一个单元格数组

Time =
'2000Q1'    '2000Q2'    '2000Q3'    '2000Q4'    '2001Q1'    '2001Q2'    '2001Q3'...
或者,如果跳过
'Q'
,可以将每个数字保存在一个数组中

Time = arrayfun( @(y,q) y*10+q, Year, Q )
使用正则数组生成

Time =
   20001       20002       20003       20004       20011       20012       20013 ...      

这是因为您正在将m初始化为零(136,1),然后尝试将完整字符串保存到第一个值中。很明显,一个替身不能容纳一根弦

我给你两个选择,但我喜欢第一个


1。-您只需使用单元格数组,即可将代码转换为:

  m = cell(136,1)
  for ii=1:136
           m{ii}= strcat(Q(ii),Year(ii));
  end
然后
m
将是:
m{1}='2000Q1'


2。-或者如果您知道您的字符串将始终保持相同的大小(在您的情况下,它就像它们总是6),您可以:


然后
m
将是:
m(1,:)=[50 48 48 48 81 49]
转换后的do ASCII将是2000Q1

如果你的向量
Year
Q
具有相同数量的元素,你不需要一个循环,只需将它们转置(或确保它们在列中),然后与
[]
操作员:

Time = [ num2str(Year.') num2str(Q.') ] ;
将为您提供:

20001
20002
20003
20004
20011
...
2000Q1
2000Q2
2000Q3
2000Q4
2001Q1
...

如果需要
'Q'
字符,请将其插入表达式中:

Time = [ num2str(Year.') repmat('Q',length(Q),1) num2str(Q.') ]
time = cellstr( [num2str(Year.') repmat('Q',length(Q),1) num2str(Q.')] ) ;
将为您提供:

20001
20002
20003
20004
20011
...
2000Q1
2000Q2
2000Q3
2000Q4
2001Q1
...

这将是一个字符数组,如果需要单元格数组,请在同一表达式上使用
cellstr

Time = [ num2str(Year.') repmat('Q',length(Q),1) num2str(Q.') ]
time = cellstr( [num2str(Year.') repmat('Q',length(Q),1) num2str(Q.')] ) ;

要获取字符串

strtrim(mat2cell(num2str([Year(:) Q(:) ],'%i%i'), ones(1,numel(Q))));
说明:

  • 将两个数字向量合并为两列(使用
    […]
  • 转换为字符数组,其中每行是两个数字的串联(使用with-like格式说明符)。假设所有数字都是整数(如果不是,请更改格式说明符)。如果并非所有串联数字的位数都相同,则可能会引入不需要的空格
  • 转换为单元格数组,将每行放在不同的单元格中(使用)
  • 删除每个单元格中的空白(使用)

  • 要获取编号:适用于上述内容:

    str2double(strtrim(mat2cell(num2str([Year(:) Q(:) ],'%i%i'), ones(1,numel(Q)))));
    
    或者直接计算

    10.^ceil(max(log10(Q)))*Year + Q;
    

    我正要向Hoki建议这个解决方案。对于Q.@C.Chris中的两位数字来说是很好的,可能你的向量已经是列格式的(不像你文章中的描述)。在这种情况下,请在
    年末
    Q
    时删除
    操作符。