指数超过矩阵维度

时间:2012-11-16 17:12:04

标签: matlab markov-chains

我试图在matlab中获得这个低阶递归函数。我希望计算下一步的网站状态概率,因为我有初步概率为该状态。

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]

这就是我所做的!但我的索引总是超过矩阵尺寸!我需要帮助。

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是:

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

2 个答案:

答案 0 :(得分:1)

问题是Dij而不是pDij具有固定长度,因此当i超过该值时,程序会抛出错误。

添加了:

我无法在代码中看到你的逻辑,但我有一种强烈的感觉,你在计算错误。 Dij是一个7 x 7矩阵,但您可以通过调用Dij(i)将其视为向量。如果您尝试将某些内容乘以行或列,则需要Dij(i,:)Dij(:, i)表示法。

答案 1 :(得分:0)

你发布它的逻辑不起作用,本质上,p(i + i)还没有定义。有几种方法可以实现,具体取决于您是否要保持p。我将发布一个保持p的方法,但是可以做一些工作来提高代码效率。

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