2016-05-13 85 views
0
clc 
clear 
N=10; 
dE=0; 

demonEnergy=0; 
systemEnergy=-10; 
ring=ones(10,1); 
temp=zeros(1,10000); 
demonAcc=zeros(1,10000); 
start=1; 

for i = 1:+1: 10000,  
    random=randi(10,1); 
    newSpin=-ring(random); 
    ring(random)=newSpin; 
    dE=2*newSpin*(ring*(mod(random+1,10))+ring*(mod(random+9,10))); 

     if dE<0 
      demonEnergy=demonEnergy+abs(dE); 
      systemEnergy=systemEnergy-abs(dE); 
     elseif demonEnergy>=dE 
      systemEnergy=systemEnergy+abs(dE); 
      demonEnergy=demonEnergy-abs(dE); 
     end 

    demonAcc(i)=dE; 
    temp(i)=-1/(atanh(demonAcc(i))); %J=1 
    dE=0; 
end 

错误:Matlab:元素大小错误?

In an assignment A(:) = B, the number of elements in A and B must be the same.

Error in PlotTest1 (line 29) demonAcc(i)=dE;

现在,我不明白为什么这是不允许的。我将我的Array的元素设置为等于相同大小的数字。想到的一点是,也许我不能将它设置为负数,但我在循环外尝试了一次测试,并且它完美地工作。有什么建议么?

+0

我怀疑你的错误在'dE = 2 * newSpin ...'行中。你在两个地方乘以'ring *(...)',我认为你想索引到'ring'。如你的代码所示,'dE'的大小为(10,1)'。 – beaker

+0

谢谢..多数民众赞成在这样一个愚蠢的错误。但是,现在我得到这个“下标索引必须是真正的正整数或逻辑 错误在PlotTest1(第19行) dE = 2 * newSpin *(ring(mod(random + 1,10))+ ring(mod (随机+ 9,10)));” – Lenol

+0

mod函数可以返回0,0不能是数组索引。 – oro777

回答

0

我不知道背后

dE=2*newSpin*(ring*(mod(random+1,10))+ring*(mod(random+9,10))); 

意图我假设dE是一个单一的值。目前不是。目前dE是大小为10x1的矩阵。所以,着执行

demonAcc(i)=dE; 

,因为你不能把dE这是大小10x1的矩阵为demonAcc(i)这是期待一个值。否则,你将不得不改变它矩阵这样

demonAcc(:,i)=dE; 

然后demonAcc规模将成为10x10000。目前是1x10000

demonAcc=zeros(1,10000); 

将变为

demonAcc=zeros(10,10000); 

dE将变得dE(j)这是另一种循环内在下面的代码

if dE<0 
      demonEnergy=demonEnergy+abs(dE); 
      systemEnergy=systemEnergy-abs(dE); 
     elseif demonEnergy>=dE 
      systemEnergy=systemEnergy+abs(dE); 
      demonEnergy=demonEnergy-abs(dE); 
     end 

一切取决于如果dE是基质或单个值。 如果dE是单值更新

dE=2*newSpin*(ring*(mod(random+1,10))+ring*(mod(random+9,10))); 

给单个值dE和您的错误就会消失。