以下代码在从每行中选择一个随机数后减去容差。我在这里犯了一个小错误。我不想从转换中减去对角线元素的容差。我该如何解决这个问题? 任何帮助表示赞赏。
clear all;
close all;
clc;
tolerance= 0.01;
Transition = [0.06 0.47 0 0.47 0 0 0;
0.47 0.06 0.47 0 0 0 0;
0 0.47 0.06 0.47 0 0 0;
0.47 0 0.47 0.037 0.023 0 0;
0 0 0 0.023 0.037 0.47 0.47;
0 0 0 0 0.47 0.06 0.47;
0 0 0 0 0.47 0.47 0.06];
len=length(Transition);
Dij=Transition;
% Assigned status of all the sites at given time k
S_k= [0 1 1 1 1 0 0];
for i=1:7
while(1)
sel=randi(7);
if(Dij(i,sel)~=0)
show(i)=sel;
break;
end
end
Dij(i,sel)=Dij(i,sel)-tolerance;
end
我想进行这个循环,直到其中一个非对角元素为零。
答案 0 :(得分:4)
如果我理解正确,那么你只需要改变这一行
if(Dij(i,sel)~=0)
包括它也不在对角线上的条件
if((Dij(i,sel) ~= 0) && (i ~= sel))
除非您仍然想在对角线上调用show()而不进行减法,在这种情况下只需将该逻辑向下移动,即
Dij(i,sel)=Dij(i,sel)-tolerance*(i ~= sel);
但也只是一个评论。 while(1) break;
不是一个伟大的结构。你可以只在上方while(Dij(i, sel)~= 0)
和Dij(i, sel) = 0
,并且根本不需要打电话给休息。
最后,我的理解是,如果所有列都为0,你已经打开了自己的无限循环。也许这种情况永远不会发生,只需要考虑一下。