2017-10-19 16 views
0

J'ai une équation pour laquelle j'essaie d'écrire un code dans Matlab, mais je ne suis pas sûr si mon code est correct. L'équation est la suivante:Matlab code équivalent de l'équation suivante

Equation

où je pense que l'itération est terminée l'exposant à-dire k, k + 1, etc, et les dimensions sont marquées par des indices m, n, n ». Les notations ne sont pas bien définies dans la littérature, donc je pense que c'est comme ça que ça devrait être.

Mon segment de code pour cette équation est la suivante:

c_n = [1,2,3,4]';  % c^(0)_n (nx1) vector 
K = 50; 
d = [0.5,0.9]'; 

for k = 1:1:K 
c_n = c_n.*((sum(A_mn'*d/(sum(A_mn*c_n,2)),2))./sum(A_mn',2)) ; 
end 

Est-ce bon code pour l'équation ci-dessus ?. Les sommations dans l'équation me confondent.

+0

Nous avons besoin de plus de perspicacité quant à la pièce de dix cents nsionalité des variables que vous avez listées ici. Les vecteurs 'c' et' d' sont-ils? Est-ce que 'A' est une matrice? – rayryeng

+0

oui 'c' et' d' sont des vecteurs, 'A' est une matrice (mxn). 'A^T' est juste une transposition de' A'. – radk

+0

Ce sont toutes des opérations matricielles de base, pas besoin de somme. C'est pourquoi ils ont une somme sur «A^T» au lieu de la même somme sur juste «A» avec les indices transposés. –

Répondre

1

Si A est une matrice avec m lignes et colonnes n, la somme \sum_{m} (A^T)_{nm} est la somme de la n ème ligne dans AT. C'est la même chose que la somme correspondante de la colonne n dans A: \sum_{m} A_{mn}. La multiplication de la matrice qu'elle représente fonctionne mieux avec la transposition, car les multiplications matricielles ne sont que des sommes de lignes pondérées.

De même, \sum_{n'} A_{mn'}c_{n'} est la mième ligne de A, pondérée par élément par c.

On peut supposer que c et d sont colonne vecteurs de taille n et m, respectivement. (d' sera représenté simplement d dans le code). Dans ce cas, la plupart des opérations peut être réduite aux opérations de la matrice:

  1. \sum_{n'} A_{mn'}c_{n'} est juste le produit de la matrice A * c, ce qui donne un vecteur colonne de taille m.
  2. \frac{d'_m}{\sum_{n'} A_{mn'}c_{n'}} devient alors le rapport élément par élément d ./ (A * c), également de taille m.
  3. Le ratio est utilisé pour mettre à l'échelle les éléments de la somme de AT dans le numérateur, ce qui en fait le produit matriciel A.' * (d ./ (A * c)) de taille n.
  4. Chaque élément de ce est mis à l'échelle par \sum_{m} (A^T)_{nm}, qui peut être représenté par A.' * ones(m, 1) ou sum(A, 1).', de sorte que le produit de la matrice finale est juste c .* (A.' * (d ./ (A * c)) ./ sum(A, 1).').

Vous pouvez pré-calculer sum(A, 1).', appelez e pour obtenir ce qui suit:

c = [1; 2; 3; 4]; 
d = [0.5; 0.9]; 
A = ... some 2x4 matrix; 
e = sum(A, 1).'; 
k = 50; 

for i = 1 : k 
    c = c .* (A.' * (d ./ (A * c)) ./ e); 
end 

Si vous souhaitez conserver les valeurs intermédiaires de c pour chaque k, vous pouvez allouer une matrice de taille n, k + 1 et remplissez cela avec chaque colonne représentant une nouvelle itération de c:

c = zeros(4, 51); 
c(:, 1) = [1; 2; 3; 4]; 
for i = 1 : k 
    c(:, k + 1) = c(:, k) .* (A.' * (d ./ (A * c(:, k))) ./ e); 
end 
+0

Mon code semble renvoyer le même résultat que le vôtre. Mais, le vôtre est certainement plus propre et efficace. Merci pour l'explication détaillée aussi. – radk

+0

@radk. Je soupçonne que votre implémentation est correcte aussi. –

+0

@radk, si cette réponse vous a été utile, vous devez le sélectionner. –