2014-12-01 3 views
1

Привет У меня есть эти два вектораСоздание массива из ул конкатенации 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 = [20001,20002,20003,20004,20010....] 

или

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

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

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

И Matlab outputed мне это:

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

Помощь pls?

ответ

0

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

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

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


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

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

, а затем m будет: m{1}='2000Q1';


2.- Или, если вы знаете, что ваши строки будут всегда иметь тот же размер (в вашем случае это Lokos как они всегда 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

2

Если векторы 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.')]) ; 
+0

1rst один дает мне 2000 2000 2000 2000 2001 .... 1 2 3 4 1 2 3 4 ... –

+0

@ C.Chris, может быть, ваши векторы уже были в формате столбцов (в отличие от описания в вашем сообщении). В этом случае удалите оператор '.'' в конце' Year' и 'Q'. – Hoki

1

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

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

Объяснение:

  1. Согласовать как числовые векторы в виде двух столбцов (с использованием [...])
  2. C onvert to char array, где каждая строка является конкатенацией двух чисел (с использованием 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; 
+0

Я собирался предложить это решению Хоки. И было бы хорошо для двузначных чисел в Q. – Divakar

Смежные вопросы