2016-05-13 81 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和您的錯誤就會消失。