2013-02-26 3 views
0

Я новичок в Matlab. Простым примером я хочу понять вектологию. Как я могу векторизовать следующий фрагмент кода.Простая реализация векторизации в matlab

for i = 1:z 
    binno = binno + f*floor(clip(:,:,i)*bins/256); 
    f=f*bins; 
end 

Это очень простой код, но мне нужно, чтобы понять, как я могу векторизации его properly.Problem является е пересчитывается после каждого цикла. Редактировать: Binno - это матрица 2d, клип 3d и f и буферы являются скалярными.

+0

Не могли бы вы положить в некоторых уточнений размера? Я предполагаю, что 'clip' является 3D,' binno' является двумерной матрицей, а 'f' и' bins' являются скалярами? –

+0

@DedekMraz Да, вы правы. Я уточню вопрос. Любые предложения относительно того, как я его вектурирую? – MaxSteel

ответ

3

Вы можете сделать это в три этапа:

  1. создать вектор факторов; сделать его 1-на-1 на г

    fact = f .* bins.^(0:z-1); 
    fact = reshape(fact,1,1,[]); 
    
  2. многозарядных клип факторов

    tmp = bsxfun(@times,floor(clip*bins/256),fact); 
    
  3. сумма все,

    binno = sum(tmp,3); 
    
+0

В моем исходном коде, если мне нужно повторно использовать значение f после окончания цикла, то есть конечное значение f в цикле, как мне это сделать? – MaxSteel

+0

@Panther: вы можете использовать 'fact (end)' для использования конечного значения 'f'. – Jonas

+0

Возможно ли получить разные результаты? Кроме того, я хочу получить значение f, как я получил в своем исходном цикле в конце исходного цикла. – MaxSteel

1

Иногда это помогает записать значения первых нескольких циклов, а затем найти шаблон. Вектор F (одна запись на итерацию) начинается с первого f (назовем его f0). Затем вторая запись - f0*bins. Тогда f0*bins^2 и т.д. Так F является f0*[1 bins bins^2 bins^3]... и может быть рассчитана как

F = f0 * bins .^ (0:z-1); 

так Бункеры^0 равен 1.

Еще до этого, вы были в состоянии вычислить все floor операцию сразу: floor(clip*bins/256). Теперь вам просто нужно выяснить, как умножить вектор P-элементов F на эту трехмерную матрицу MxNxP. bsxfun будет делать такие вещи, но размеры должны совпадать или быть точными 1. Таким образом, F должен быть 1x1xP вместо P. Затем просто суммируйте все это по 3-му измерению.

binno = sum(bsxfun(@times, floor(clip*bins/256), reshape(F, [1 1 length(F)])), 3);

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

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