2013-04-28 3 views
7

Я в значительной степени новичок, поэтому, возможно, возможно сделать то, что хочу, простым способом. У меня есть матрица 121x62, но мне нужно развернуть ее до 121x1488, чтобы каждый столбец повторялся 24 раза. Например, преобразование этого:Matlab: повторяйте каждый столбец последовательно n раз

2.2668  2.2667  2.2667  2.2666  2.2666  2.2666  
    2.2582  2.2582  2.2582  2.2582  2.2581  2.2581  
    2.283  2.283  2.283  2.2829  2.2829  2.2829  
    2.2881  2.2881  2.2881  2.2881  2.2881  2.288   
    2.268  2.268  2.2679  2.2679  2.2678  2.2678  
    2.2742  2.2742  2.2741  2.2741  2.2741  2.274  

в это:

2.2668  2.2668  2.2668 and so on to 24th  2.2667  2.2667 and again to 24x 
2.2582  2.2582  2.2582 ... 

с каждой колонке.

Я попытался создать вектор с этими значениями, а затем преобразовать с vec2mat и нормально у меня есть 121x1488 матрица, но повторяется по строкам:

2.2668 2.2668 2.2668 2.2668 2.2668 2.2668 ... 2.2582 2.2582 2.2582 2.2582 ... 

Как сделать это с помощью колонок?

+0

Можете ли вы вставить код с преобразованием vec2mat? –

+0

GPT2 = repmat (ZHD_GPT2 (:), 1,24); X = vec2mat (GPT2,1488); – papkin

ответ

0

Здесь Вы идете:

function [result] = repcolumn(A, n) 
    %n - how many times each column from A should be repeated 

    [rows columns] = size(A); 
    result = repmat(A(:,1),1,n); 

    for i = 2:columns 
     result = [result,repmat(A(:,i),1,n)]; 
    end 
end 

Там должна быть более простой способ, но это делает работу.

+0

Спасибо. Он достаточно чистый и работает – papkin

22

Предположим, у вас есть эта упрощенный вход и вы хотите расширить столбцы последовательно n раз:

A = [1 4 
     2 5 
     3 6]; 

szA = size(A); 
n = 3; 

Есть несколько способов сделать это:

  • Репликация, а затем изменить форму:

    reshape(repmat(A,n,1),szA(1),n*szA(2)) 
    
  • Кронекера продукта:

    kron(A,ones(1,n)) 
    
  • Использование FEX: expand():

    expand(A,[1 n]) 
    
  • С R2015a, repelem():

    repelem(A,1,n) 
    

Все дают одинаковый результат:

ans = 
    1  1  1  4  4  4 
    2  2  2  5  5  5 
    3  3  3  6  6  6 
+4

+1 для решения 'kron' – Shai

+0

Спасибо за три решения. Есть ли предпочтения в отношении производительности? Фактически, я делаю это в огромной петле, что делает производительность весьма важной. –

+1

@AlirezaMirian Replicate, reshape должен быть самым быстрым. – Oleg

1

Только для полноты. Если вы хотите дублировать вдоль строк, вы также можете использовать rectpulse().

A = [1,2,3;... 
    4,5,6]; 

n = 3; 

rectpulse(A, n); 

дает

1 2 3 
1 2 3 
1 2 3 
4 5 6 
4 5 6 
4 5 6