2010-02-22 8 views
1

У меня есть для цикла, который выполняет следующие функции:Можно ли векторизовать следующий цикл?

взять М на 8 матрицу и:

  1. разделить его на блоки размером 512 элементов (значение X на 8 матрицы == 512, а количество элементов может быть 128,256,512,1024,2048)
  2. Измените блок на 1 на 512 (количество элементов) матрицы.
  3. Возьмите последнюю 1/4 матрицы и положите ее спереди,
    , например. Data = [Data(1,385:512),Data(1,1:384)];

Ниже мой код:

for i = 1 : NumOfBlock 
    if i == 1 
     Header = tempHeader(1:RowNeeded,:); 
     Header = reshape(Header,1,BlockSize); %BS 
     Header = [Header(1,385:512),Header(1,1:384)]; %CP 
     Data = tempData(1:RowNeeded,:); 
     Data = reshape(Data,1,BlockSize); %BS 
     Data = [Data(1,385:512),Data(1,1:384)]; %CP 
     start = RowNeeded + 1; 
     end1 = RowNeeded * 2; 
    else 
     temp = tempData(start:end1,:); 
     temp = reshape(temp,1,BlockSize); %BS 
     temp = [temp(1,385:512),temp(1,1:384)]; %CP 
     Data = [Data, temp]; 
    end 

    if i <= 127 & i > 1 
     temp = tempHeader(start:end1,:); 
     temp = reshape(temp,1,BlockSize); %BS 
     temp = [temp(1,385:512),temp(1,1:384)]; %CP 
     Header = [Header, temp]; 
    end 

    start = end1 + 1; 
    end1=end1 + RowNeeded; 
end 

Запуск этого цикла с 5 млн элемент будет принимать более чем на 1 час. Мне нужно, чтобы это было как можно быстрее (в секундах). Можно ли векторизовать эту петлю?

ответ

0

Еще раз хотел бы поблагодарить Амро за то, что вы дали мне представление о том, как решить мой вопрос. Извините за то, что я не понял себя в вопросе.

Вот мое решение моей проблемы:

%#BS CDMA, Block size 128,512,1024,2048 
    BlockSize = 512; 
    RowNeeded = BlockSize/8; 
    TotalRows = size(tempData); 
    TotalRows = TotalRows(1,1); 
    NumOfBlock = TotalRows/RowNeeded; 
    CPSize = BlockSize/4; 

%#spilt into blocks 
    Header = reshape(tempHeader',[RowNeeded,8, 128]); 
    Data = reshape(tempData',[RowNeeded,8, NumOfBlock]); 
    clear tempData tempHeader; 

%#block spread & cyclic prefix 
    K = zeros([1,BlockSize,128],'single'); 
    L = zeros([1,BlockSize,NumOfBlock],'single'); 
     for i = 1:NumOfBlock 
      if i <= 128 
       K(:,:,i) = reshape(Header(:,:,i),[1,BlockSize]); 
       K(:,:,i) = [K((CPSize*3)+1:BlockSize),K(1:CPSize*3)]; 
      end 
      L(:,:,i) = reshape(Data(:,:,i),[1,BlockSize]); 
      L(:,:,i) = [L((CPSize*3)+1:BlockSize),L(1:CPSize*3)]; 
     end 
0

Было бы хорошо, если бы вы сказали, что вы пытаетесь сделать (моя догадка - это симуляция в динамических системах, но это трудно сказать).

да, конечно, это может быть векторизован: каждый из ваших блоков на самом деле состоит из четырех субблоков; используя ваши (крайне нестандартные) показатели:

1 ... 128, 129 ... 256, 257 ... 384, 385 ... 512

Каждое ядро ​​/ нить/что-нибудь, вы -Call-то из векторизации необходимо сделать следующее:

я = threadIdx составляет от 0 до 127 TEMP = данные [1 + I] данных [1 + I] = [385 данных + I] данных [ 385 + i] = данные [257 + i] данные [257 + i] = данные [129 + i] данные [129 + i] = температура

Вы должны, конечно, также распараллеливать на блоках, а не только векторизовать.

+0

Я делаю блок раздвигающим в CDMA. temp = reshape (temp, 1, BlockSize); должен взять 1-й столбец и превратить его в матрицу 1 на N.Повторите для остальных столбцов и добавьте их в конец матрицы 1-го по N. temp = [temp (1,385: 512), temp (1,1: 384)]; состоит в том, чтобы выполнить циклическую префиксную вставку. –

4

На основании вашего описания функции, вот что я придумал:

M = 320;   %# M must be divisble by (numberOfElements/8) 
A = rand(M,8);  %# input matrix 

num = 512;   %# numberOfElements 
rows = num/8;  %# rows needed 

%# equivalent to taking the last 1/4 and putting it in front 
A = [A(:,7:8) A(:,1:6)]; 

%# break the matrix in blocks of size (x-by-8==512) into the third dimension 
B = permute(reshape(A',[8 rows M/rows]),[2 1 3]); 

%'# linearize everything 
B = B(:); 

эта схема может помочь в понимании выше:

diagram

+0

Спасибо! хотя это не совсем то, что я хочу, но ваше решение дало мне представление о том, как решить мою проблему. Извините за то, что я не понял себя в вопросе. –

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