Matlab: избавиться от петли - PullRequest
       4

Matlab: избавиться от петли

0 голосов
/ 05 января 2019

Я работаю с двоичной информацией, прочитанной из файла. Это последовательность чисел в 40-битном формате, где в моем случае следует пренебречь первыми 8-битными, а остальные 32-битные являются "перетасованными" 32-битными форматами IEEE 754 одинарной точности. Этот «случайный порядок» довольно прост: правильный двоичный код IEEE 754 я получаю, когда беру следующий бит: 24-32, 17-24, 9-16

Все это моделируется с кодом ниже.

Вопрос: Как я могу улучшить приведенный ниже код, чтобы сделать его быстрее, избавиться от цикла «for» и использовать эффективные матричные операции MATLAB?

a = (1:5*8*1000000)'; % represent indices of bits binary information, read from file
tic
a_reshaped = reshape(a, 8, [])'; 
toc %Elapsed time is 0.176375 seconds.
n_elem = size(a_reshaped,1)/5;
result = zeros(n_elem,8*4);
for i = 1:n_elem
    result(i,:) = [a_reshaped(5*i,:) a_reshaped(5*i-1,:) a_reshaped(5*i-2,:) a_reshaped(5*i-3,:)];
end
toc %Elapsed time is 4.243868 seconds.

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Попробуйте это:

ind = size(a_reshaped,1):-1:1;
ind(end:-5:1) = []; %remove the indices for rows you don't need
a_reduced = a_reshaped(ind,:);
result = flipud(reshape(a_reduced',8*4,[])');
0 голосов
/ 05 января 2019

цикл for можно заменить внутри следующего однострочного кода, что намного быстрее:

result(1:n_elem,:) = [a_reshaped(5*(1:n_elem),:) a_reshaped(5*(1:n_elem)-1,:) a_reshaped(5*(1:n_elem)-2,:) a_reshaped(5*(1:n_elem)-3,:)]; %Elapsed time is 0.766840 seconds.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...