Vectorizing a recursive for loop avoiding numerical underflow

1 回表示 (過去 30 日間)
Josh Parks
Josh Parks 2020 年 3 月 23 日
コメント済み: Josh Parks 2020 年 3 月 24 日
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 件のコメント
Sriram Tadavarty
Sriram Tadavarty 2020 年 3 月 24 日
The last loop can be removed directly with
alpha(:,t) = c(t)*alpha(:,t);
Josh Parks
Josh Parks 2020 年 3 月 24 日
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

サインインしてコメントする。

回答 (0 件)

カテゴリ

Help Center および File ExchangeCreating and Concatenating Matrices についてさらに検索

製品


リリース

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by