2012-11-16 2 views
-1

J'essayais d'obtenir cette fonction récursive d'ordre inférieur dans matlab. je veux calculer la probabilité de statut d'un site au pas de temps suivant, étant donné que j'ai la probabilité initiale que ce soit un statut.index dépassant les dimentions de la matrice

P= Probability 
x= status(0,1) 
Dij= probability to pick a site 
P(Status of Site(i) being x at next time step)= Summation[P(Status of Site(i) being x at previous time step)*Dij] 

et c'est ce que j'ai fait! mais mon index dépasse toujours les dimensions de la matrice! J'ai besoin d'aide avec ça.

clear all; 
clc; 

%function [t,i]= CopyingInfluenceModel 
%%Define constants 
%% generate some random weights vectori.e. the transition matrix=C 
% C=[0 (1,2) 0 (1,4) 0 0 0; 
% (2,1) 0 (2,3) 0 0 0 0; 
% 0 (3,2) 0 (3,4) 0 0 0; 
% (1,4) 0 (4,3) 0 (4,5) 0 0; 
% 0 0 0 (5,4) 0 (5,6) (5,7); 
% 0 0 0 0 (6,5) 0 (6,7); 
% 0 0 0 0 (7,5) (7,6) 0]; 
%copying probabilities=branch weights 
onetwo=0.47; 
twothree=0.47; 
threefour=0.47; 
onefour=0.47; 
fourfive=0.023; 
fivesix=0.47; 
fiveseven=0.47; 
sixseven=0.47; 
selfweight1=0.06; 
selfweight2=0.037; 
% SourceNodes - a list of Nodes that are forced to be kept in one side of the cut. 
% WeightedGraph - symetric matrix of edge weights. Wi,j is the edge 
% connecting Nodes i,j use Wi,j=0 or Wi,j == inf to indicate unconnected Nodes     

WeightedGraph=[0 onetwo 0 onefour 0 0 0; 
onetwo 0 twothree 0 0 0 0; 
0 twothree 0 threefour 0 0 0; 
onefour 0 threefour 0 fourfive 0 0; 
0 0 0 fourfive 0 fivesix fiveseven; 
0 0 0 0 fivesix 0 sixseven; 
0 0 0 0 fiveseven sixseven 0]; 
Dij=sparse(WeightedGraph); 


% Initializing the variables 
t=[]; 
i=[]; 
%assigining the initial conditions 
t(1)=0; 
p(1)= 0.003; %% initial probability of status 
%set index no i to 1(initial condition for i=1) 
i=1; 
%repeating calculating new probabilities 

%% If the probability is zero, terminate while loop 
while p(i)>=0 
    %calculate at the next time step for given index no 
    t(i+1)= t(i); 
    %calculate the status_probability at given time t=(i+1) 
    [p(i+1)]=[p(i)]+sum([p(i)]*[Dij(i)]); 
    [NextStatus(i)]= [p(i+1)] 

%index i increases by 1 to calculate next probability 
i=i+1; 
end 

Stack Trace est:

%%??? Index exceeds matrix dimensions. 
%%Error in ==> CopyingInfluenceModel at 54 
%%[p(i+1)]=[p(i)]+sum([p(i)]*[Dij(i)]); 
+0

Pouvez-vous poster la trace de la pile avec pointant vers la ligne de la première erreur? – PearsonArtPhoto

+0

le voici .. %% ??? L'index dépasse les dimensions de la matrice. %% Erreur dans ==> CopyingInfluenceModel à 54 %% [p (i + 1)] = [p (i)] + somme ([p (i)] * [Dij (i)]); – happyme

+0

Pouvez-vous préciser cette question avec un P correctement initialisé? (Si le point serait juste le calcul que vous avez mentionné au début.) –

Répondre

1

Le problème est Dij pas p. Dij a une longueur fixe donc quand i dépasse que le programme jette une erreur.

Ajouté:

Je ne peux pas vraiment voir votre logique dans le code, mais j'ai un fort sentiment que vous calculez quelque chose de mal. Dij est une matrice 7 x 7 mais vous la traitez comme un vecteur en appelant Dij(i). Si vous essayez de multiplier quelque chose par une ligne ou une colonne, vous avez besoin de la notation Dij(i,:) ou Dij(:, i).

+0

Comment puis-je changer le code matlab, afin de le rendre correct? Pardonnez-moi mon ignorance avec matlab. Je suis une nouvelle fille dans ce domaine de la programmation. – happyme

+0

Pour être honnête, il semble y avoir beaucoup de problèmes avec ce code. Voici quelques-uns des problèmes: (1) vous mentionnez si la probabilité est nulle, donc la condition 'while' devrait être' p (i)> 0' (2) 'p (i)' dans votre code n'est jamais zéro parce qu'il commence comme un nombre positif et à chaque itération un autre nombre positif y est ajouté. (3) 'Dij (i)' est un nombre unique et donc 'p (i)' donc votre terme '[p (i)] * [Dij (i)]' - qui a d'ailleurs beaucoup d'extra entre parenthèses et est vraiment équivalent de 'p (i) * Dij (i)' - est un nombre unique, rendant la fonction somme() complètement inutile. Je referais le tout. – Bee

+0

Oh oh! D'accord!! – happyme

0

La logique que vous avez publié cela ne fonctionne pas, essentiellement, p (i + i) n'est pas encore défini. Il y a plusieurs façons de le faire, selon que vous voulez garder p ou non. Je vais poster une méthode qui reste en place, mais un peu de travail pourrait être fait pour rendre le code plus efficace.

p=[p;p(i)+sum(p(i)*Dij(i))]; 
NextStatus(i)= p(i+1) 
+0

Je veux mettre en place une simple chaîne markov dans matlab! – happyme

+0

Eh bien, cela devrait corriger votre erreur car elle est publiée pour un petit nombre d'itérations. Si vous commencez à itérer plus de 100, ce code nécessiterait une réécriture. Il peut encore être nécessaire d'effectuer un travail sérieux d'autres manières, cependant ... – PearsonArtPhoto

+0

Je veux mettre en place une simple chaîne de markov dans matlab où un réseau de nœuds où la probabilité du nœud i prend le statut m à temps (t + 1) peut être suivi en utilisant: 'P (Statut du site (i) étant x au pas suivant) = Summation [P (Statut du site (i) étant x au pas de temps précédent) * Dij]' – happyme

Questions connexes