store values from a for loop in a column vector?

7 Ansichten (letzte 30 Tage)
Margaret Winding
Margaret Winding am 10 Feb. 2017
Bearbeitet: Jan am 12 Feb. 2017
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?

Akzeptierte Antwort

James Tursa
James Tursa am 10 Feb. 2017
Bearbeitet: James Tursa am 10 Feb. 2017
No need for the for-loop, just a one-liner:
b = b0.*(x.^(m)./(K.^(m)+ x.^(m))); % <-- changed the / to a ./
  5 Kommentare
James Tursa
James Tursa am 11 Feb. 2017
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
Margaret Winding
Margaret Winding am 11 Feb. 2017
thank you so much for your help!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Jan
Jan am 12 Feb. 2017
Bearbeitet: Jan am 12 Feb. 2017
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 am 10 Feb. 2017
Bearbeitet: John BG am 10 Feb. 2017
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

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by