Создание массива из конкатенации str 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]

и

Year = [2000,2000,2000,2000,2001,2001,2001,2001,2002.....]

и я хотел бы объединить их в один массив Time

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

Or

Time= {'2000Q1', '2000Q2', '2000Q3', '2000Q4', '2001Q1'....}

До сих пор я пытался с этим кодом

  m = zeros(136,1)
  for i=1:136
           m(i,1)= strcat(Q(i),Year(i));
  end

И Matlab вывел мне это:

Несоответствие размера назначения в подписке.

Помогите пожалуйста?


person C. Chris    schedule 01.12.2014    source источник


Ответы (4)


Вы можете использовать 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 ...      
person Shai    schedule 01.12.2014

Если ваши векторы Year и Q имеют одинаковое количество элементов, вам не нужен цикл, просто переставьте их (или просто убедитесь, что они находятся в столбце), а затем соедините с оператором []:

Time = [ num2str(Year.') num2str(Q.') ] ;

дам тебе:

20001
20002
20003
20004
20011
...

И если вы хотите символ 'Q', вставьте его в выражение:

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

Дам тебе:

2000Q1
2000Q2
2000Q3
2000Q4
2001Q1
...

Это будет массив символов, если вам нужен массив ячеек, используйте cellstr в том же выражении:

time = cellstr( [num2str(Year.') repmat('Q',length(Q),1) num2str(Q.')] ) ;
person Hoki    schedule 01.12.2014
comment
@C.Chris, возможно, ваши векторы уже были в формате столбца (в отличие от описания в вашем посте). В этом случае удалите оператор .' в конце Year и Q. - person Hoki; 02.12.2014

Чтобы получить строки:

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

Объяснение:

  1. Объедините оба числовых вектора в два столбца (используя [...])
  2. Преобразование в массив символов, где каждая строка представляет собой конкатенацию двух чисел (используя num2str с sprintf-подобными спецификаторами формата). Предполагается, что все числа целые (если нет, измените спецификаторы формата). Это может привести к нежелательным пробелам, если не все составные числа имеют одинаковое количество цифр.
  3. Преобразуйте в массив ячеек, поместив каждую строку в другую ячейку (используя mat2cell).
  4. Удалите пробелы в каждой ячейке (используя strtrim)

Чтобы получить числа: примените str2double к над:

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

Или вычислить напрямую

10.^ceil(max(log10(Q)))*Year + Q;
person Luis Mendo    schedule 01.12.2014
comment
Я собирался предложить это решению Хоки. И было бы хорошо для двузначных чисел в Q. - person Divakar; 01.12.2014

Это потому, что вы инициализируете m нулями (136,1), а затем пытаетесь сохранить полную строку в первое значение. и, очевидно, двойник не может удерживать строку.

Я даю вам 2 варианта, но я предпочитаю первый.


1.- вы можете просто использовать массивы ячеек, чтобы ваш код преобразовывался в:

  m = cell(136,1)
  for ii=1:136
           m{ii}= strcat(Q(ii),Year(ii));
  end

и тогда m будет: m{1}='2000Q1';


2.- Или, если вы знаете, что ваши строки ВСЕГДА будут одного размера (в вашем случае это похоже на то, что они всегда равны 6), вы можете:

  m = zeros(136,strsize)
  for ii=1:136
           m(ii,:)= strcat(Q(ii),Year(ii));
  end

а затем m будет: m(1,:)= [ 50 48 48 48 81 49 ], который переведен в ASCII, будет 2000Q1

person Ander Biguri    schedule 01.12.2014