MATLAB Answers

I keep getting undefined function when preallocating

2 views (last 30 days)
Jamil Dudhwala
Jamil Dudhwala on 20 Feb 2019
Edited: Thorsten on 21 Feb 2019
Hi,
I am trying to create a for loop wherein the temperature that is outputted is then subbed back in, I have preallocated but i get the error undefined function '(index)' when it comes to the line: S1QAmb(index)=zeros(size(index)) %surface 1, ambient load. Since the size of the array will change with the size of the index, I did not think the (index) needed to be defined. Also, if any other mistakes are spotted, please do let me know. Thank you.
My script is below:
U=1
S1=1.7*1.2 %Surface area of surface 1
S2= 1.7*1.2 %Surface 2 area
S3= 1.7*1.2 %surface 3 area
S4= 1.7*1.2 %surface 4 area
S5= 1.7*1.2 %surface 5 area
S6= 1.7*1.2 %surface 6 area
S7= 1.7*1.2 %surface 7 area
S8= 1.7*1.2 %surface 8 area
S9= 1.7*1.2 %surface 9 area
S10= 1.7*1.2 %surface 10 area
Tout=5
ma=1
ca=2
DTM=1
deltat=1
%Prealloacate
S1QAmb(index)=zeros(size(index)) %surface 1, ambient load
S2QAmb(index)=zeros(size(index)) %surface 2, ambient load
S3QAmb(index)=zeros(size(index)) %surface 3, ambient load
S4QAmb(index)=zeros(size(index)) %surface 4, ambient load
S5QAmb(index)=zeros(size(index)) %surface 5, ambient load
S6QAmb(index)=zeros(size(index)) %surface 6, ambient load
S7QAmb(index)=zeros(size(index)) %surface 7, ambient load
S8QAmb(index)=zeros(size(index)) %surface 8, ambient load
S9QAmb(index)=zeros(size(index)) %surface 9, ambient load
S10QAmb(index)=zeros(size(index)) %surface 10, ambient load
QAmb_Total(index)=zeros(size(index)) %Total Ambient Load
deltaTin(index)=zeros(size(index))
Tin(index)=zeros(size(index))
for index=(1:30)
if (index)==1
Tin(index)=20
else
Tin(index)=Tin(index-1)+deltaTin(index)
end
%Ambient Load
S1QAmb(index)=S1*U*(Tout-+Tin(index)) %surface 1, ambient load
S2QAmb(index)=S2*U*(Tout-+Tin(index)) %surface 2, ambient load
S3QAmb(index)=S3*U*(Tout-+Tin(index)) %surface 3, ambient load
S4QAmb(index)=S4*U*(Tout-+Tin(index)) %surface 4, ambient load
S5QAmb(index)=S5*U*(Tout-+Tin(index)) %surface 5, ambient load
S6QAmb(index)=S6*U*(Tout-+Tin(index)) %surface 6, ambient load
S7QAmb(index)=S7*U*(Tout-+Tin(index)) %surface 7, ambient load
S8QAmb(index)=S8*U*(Tout-+Tin(index)) %surface 8, ambient load
S9QAmb(index)=S9*U*(Tout-+Tin(index)) %surface 9, ambient load
S10QAmb(index)=S10*U*(Tout-+Tin(index)) %surface 10, ambient load
%Total Ambient Load in Array Form
QAmb_Total(index)=S1QAmb(index)+S2QAmb(index)+S3QAmb(index)+S4QAmb(index)+S5QAmb(index)+S6Amb(index)+S7QAmb(index)+S8QAmb(index)+S9QAmb(index)+S10QAmb(index)
%changein air cabin temperature where deltat is timestep
deltaTin(index)=(QAmb_Total(index)/((ma*ca)+DTM))*(deltat)
%New car cabin temperature
Tin(index)=Tin(index-1)+deltaTin(index)
end

  0 Comments

Sign in to comment.

Accepted Answer

Thorsten
Thorsten on 20 Feb 2019
Edited: Thorsten on 20 Feb 2019
index = 1:30;
% Preallocate
S1QAmb = zeros(size(index)); % index has to be defined before it can be used
for i = index
S1QAmb(i) = S1*U*(Tout+Tin(i)); % you wrote -+; that's invalid syntax
% and so on
end
You should also consider to use an array for S
S = 1.7*1.2*ones(1, 10);
and compute all S values in one line in the for loop
SQAmb(i,:) = S*U*(Tout+Tin(i));
with SQAmb preallocated as a matrix
SQAmb = zeros(numel(index), numel(S));

  5 Comments

Show 2 older comments
Steven Lord
Steven Lord on 20 Feb 2019
Thorsten's suggestion to avoid tucking an index into the variable name is a good one, and is the generally recommended best practice on Answers.
As an aside, this isn't technically correct.
% you wrote -+; that's invalid syntax
Writing something like "1-+2" is valid. It is perhaps confusing to read, but it is valid.
The unary plus operator has higher precedence (level 4 unless raising to a power is involved, in which case it's level 3) than the subtraction operator (level 6), so this is equivalent to "1-(+2)" which is 1-2 or -1. That's the same reason "1--1" returns 2 -- unary plus and unary minus are at the same precedence level.
Jamil Dudhwala
Jamil Dudhwala on 20 Feb 2019
Sorry to bother you guys, but it seems I keep getting the error "subscript must either be real positive integers or logicals".
This must be because I have started of from i = 1, hence i - 1 = 0 and thats where the problem is. I thought that my ' if ' loop woould have sold that issue, but it does not seem to be working.
Thank you,
My revised script is below:
U=1
S = 1.7*1.2*ones(1, 10);
Tout = 5
ma = 1
ca = 2
DTM = 1
deltat = 1
index = 1:30;
%Prealloacate
SQAmb = zeros(numel(index), numel(S));
QAmb_Total = zeros(size(index));
deltaTin = zeros(size(index));
Tin = zeros(size(index));
%for loop
for i = index
if (i)==1
Tin(i) = 20
else
Tin(i) = Tin(i-1)+deltaTin(i)
end
SQAmb(i,:) = S*U*(Tout-Tin(i));
%Total Ambient Load in Array Form
QAmb_Total(i) = sum(SQAmb(i,:))
%change in air cabin temperature where deltat is timestep
deltaTin(i) = (QAmb_Total(i)/((ma*ca)+DTM))*(deltat)
%New car cabin temperature
Tin(i) = Tin(i-1)+deltaTin(i)
end
Thorsten
Thorsten on 21 Feb 2019
The if clause is fine. The problem occurs in the last but one line. You need to handle the case i == 1 also for this line.

Sign in to comment.

More Answers (0)

Sign in to answer this question.