Vectorizing a recursive for loop avoiding numerical underflow

1 visualizzazione (ultimi 30 giorni)
Hi all,
I'm currently trying to vectorize a couple nested for loops that have a scaling coefficient (c) in there to prevent numerical underflow (note a(i,j) always less than 1). Any help is much appreciate!
Thanks,
Josh
N = 4;
T = 120000000;
M = 170;
O = randi(M,1,T);
B = zeros(N,M);
alpha = zeros(N,T);
A = rand(N);
B = rand(N,M);
c = zeros(1,T);
%compute alpha_t(i)
for t = 2:T
for j = 1:N
for i = 1:N
alpha(j,t) = alpha(j,t) + alpha(i,t-1)*A(i,j);
end %i
alpha(j,t) = alpha(j,t)*B(j,O(t));
c(t) = c(t) + alpha(j,t);
end %j
%scale alpha_t
c(t) = 1/c(t);
for j = 1:N
alpha(j,t) = c(t)*alpha(j,t);
end
end %t
  3 Commenti
Sriram Tadavarty
Sriram Tadavarty il 24 Mar 2020
The last loop can be removed directly with
alpha(:,t) = c(t)*alpha(:,t);
Josh Parks
Josh Parks il 24 Mar 2020
Thanks, I saw the last one, the recursion is the part that's confusing me
And yes, these are right, they're getting added to each inner loop iteration, just forgot to initialize :)
%alpha_1
for i = 1:N
alpha(i,1) = pi(i)*B(1,O(1));
c(1) = c(1) + alpha(i,1);
end
%scale alpha_1
c(1) = 1/c(1);
for i = 1:N
alpha(i,1) = c(1)*alpha(i,1);
end

Accedi per commentare.

Risposte (0)

Categorie

Scopri di più su Creating and Concatenating Matrices in Help Center e File Exchange

Prodotti


Release

R2019a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by