# Decimal numbers in a triple for loop

7 ビュー (過去 30 日間)
Auryn_ 2018 年 3 月 21 日
コメント済み: Auryn_ 2018 年 3 月 22 日
Hi all, I want to run the equation for a range of q variables at an increment such as
q = 0.1:0.1:1;
I need to use a for loop, where actually I include 2 additional for loops:
a & b are 2 cells.
M=10;
for i=1:length(q)
for i1=1:M
for i2=1:M
n_pm(i)=n_pm(i)+exp(-1i*q(i)*(i1-i2))*a{i1}*b{i2};
end
end
n_pmT(i)=n_pm(i)/(2*M)^2;
end
This code however gives me either the error 'Subscript indices must either be real positive integers or logicals' or 'Index exceeds matrix dimensions', depending on how I define q in the loop.
Looking forward for some help!

#### 1 件のコメント

James Tursa 2018 年 3 月 21 日
It would help if you copy & pasted the entire error message for us, including the offending line.

サインイン to comment.

### 回答 (2 件)

James Tursa 2018 年 3 月 21 日
Have you inadvertently created a variable with the name 'exp' in your workspace? If so, clear it and don't use that name for a variable.

#### 4 件のコメント

James Tursa 2018 年 3 月 22 日
Type this at the command prompt:
dbstop if error
Then run your code. When the error occurs the code will pause with all variables intact. Examine them to see what is going on.
The exp( ) still seems like the likely culprit ...
Auryn_ 2018 年 3 月 22 日
Hi,
the error 'Index exceeds matrix dimensions' appears even if I use:
q = 0.1:0.1:1;
for i=1:length(q)
for i1=1:M
for i2=1:M
n_pm(i)=n_pm(i)+q(i)*(i1-i2)*a{i1}*b{i2};
end
end
n_pmT(i)=n_pm(i)/(2*M)^2;
end
James Tursa 2018 年 3 月 22 日
This error:
'Subscript indices must either be real positive integers or logicals' or 'Index exceeds matrix dimensions'
was probably caused by a variable named 'exp' in your workspace.
This error:
'Index exceeds matrix dimensions'
is different, and means exactly what it says. Did you use the dbstop debugging tip I gave you? When the code paused, what were these values:
i
i1
i2
numel(q)
numel(n_pm)
numel(n_pmT)
numel(a)
numel(b)

サインイン to comment.

Auryn_ 2018 年 3 月 22 日

Hi,
now it seems to work!
M=10;
q = 0.1:0.1:1;
n_pmT=zeros(length(q),1);
n_pm=zeros(M,M,length(q));
for i=1:length(q)
for i1=1:M
for i2=1:M
n_pm=n_pm+exp(-1i*q(i)*(i1-i2))*a{i1}*b{i2};
end
end
n_pmT(i)=n_pm(i)/(2*M)^2;
end

#### 2 件のコメント

James Tursa 2018 年 3 月 22 日
Well, it may run but I have my doubts that this code actually does what you want it to. Inside your inner loop you have n_pm=n_pm+etc. Do you realize that the etc part is added to all of the elements of n_pm at each iteration? Is that what you really want?
Auryn_ 2018 年 3 月 22 日
Hi James, I want a sum over the indices i1 and i2. Is that correct in the code? Thanks again!

サインイン to comment.

サインイン してこの質問に回答します。

Translated by