store values from a for loop in a column vector?

I have this function and have to store the values of b(x) over the interval
x=0.01:0.01:5
b0=10;
K=2;
m=3;
for x=0.01:0.01:5
b= b0.*(x.^(m)/(K.^(m)+ x.^(m)));
end
I don't know how to store every value in a column vector, only the value of b(5). any ideas on how to correct this code?

 채택된 답변

James Tursa
James Tursa 2017년 2월 10일
편집: James Tursa 2017년 2월 10일
No need for the for-loop, just a one-liner:
b = b0.*(x.^(m)./(K.^(m)+ x.^(m))); % <-- changed the / to a ./

댓글 수: 5

It worked, thank you! But after that I am required to use the function fminbnd to find the max of the function b on the interval [0,5], but it won't let me as it says b isn't being saved as function. Do you know how to resolve that? Thank you for all your help!
Please show the code you are using for fminbnd.
[xmax, ymax]= fminbnd(-b, 0, 5)
The first argument of fminbnd should be a function handle so that fminbnd can evaluate the function internally to find the solution. So you could use something like this:
b = @(x)b0.*(x.^(m)./(K.^(m)+ x.^(m))); % <-- create the function handle
[xmax, ymax]= fminbnd(b, 0, 5); % <-- call fminbnd
Or if you really wanted -b make that part of the function handle:
b = @(x)-b0.*(x.^(m)./(K.^(m)+ x.^(m))); % <-- create the function
thank you so much for your help!

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Jan
Jan 2017년 2월 12일
편집: Jan 2017년 2월 12일
James' answer solves the problem efficiently. But if you or anybody else requires a loop, the pre-allocation is important:
x = 0.01:0.01:5
b0 = 10;
K = 2;
m = 3;
b = zeros(size(x)); % Pre-allocate!
for ix = 1:numel(x) % Use index according to vector x
b(ix) = b0 * (x(ix) ^ m / (K ^ m + x(ix) ^ m));
end
Letting an array grow iteratively wastes a lot of resources: In the first iteration a scalar double is reserved and assigned. In the second iteration, a vector of two doubles is reserved, the former contents is copied and the last value is assigned. If you have 1000 elements, Matlab has to reserve sum(1:1000) elements by this way, which are 500'500 and copy almost the same number of doubles. For 1 million elements, we are talking about 2TB of data already, although the final result occupies 8MB RAM only (8 byte per double).
John BG
John BG 2017년 2월 10일
편집: John BG 2017년 2월 10일
may be you want to keep the for loop because there may be more omitted lines in the loop
x=0.01:0.01:5
b0=10;
K=2;
m=3;
for x=0.01:0.01:5
b= [b;b0.*(x.^(m)/(K.^(m)+ x.^(m)))];
end

카테고리

도움말 센터File Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

질문:

2017년 2월 10일

편집:

Jan
2017년 2월 12일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by