# Hello guys, I need help.

1 view (last 30 days)
Everton Silva on 27 Mar 2020
Commented: Rik on 28 Mar 2020
I need to evaluate the function in each combination of (x1, x2, x3), that is:
for i=1:11
for j=1:11
for k=1:11
z(i,j,k)=feval(f,x1(i),x2(j),x3(k));
end
end
end
This evaluation gives us an NxNxN matrix (cell?). I don't know what it's called hahahaha
[sfx, ind]=sort(z(:));
we selected the t smallest function values
sfx=sfx(1:t);
And the indexes corresponding to the t smallest function values
ind=ind(1:t);
Does anyone have any idea how I can return the values of x1, x2 and x3 corresponding to these t smallest function values?
Steven Lord on 27 Mar 2020
To compute the smallest values you can use the mink function.

Rik on 27 Mar 2020
Edited: Rik on 28 Mar 2020
The indices you get in your last operation can be converted to subscripts, which will correspond to your three inputs.
ind=ind(1:t);
[x1_ind,x2_ind,x3_ind]=ind2sub(size(z),ind);
x1=x1(x1_ind);
x2=x1(x2_ind);
x3=x1(x3_ind);
Rik on 28 Mar 2020
@Walter thanks for catching the mistake
@Everton you're welcome

Torsten on 27 Mar 2020
Edited: Walter Roberson on 28 Mar 2020
[X1,X2,X3]=ndgrid(x1,x2,x3);
Z=f(X1,X2,X3); %assumes f is vectorized
M=[X1,X2,X3,Z];
[~,idx]=sort(M(:,4));
sortedM=M(idx,:);
X1s=sortedM(1:s,1);
X2s=sortedM(1:s,2);
X3s=sortedM(1:s,3);
Everton Silva on 27 Mar 2020
For example, if I write in the command window
t=11;
f=@(x1,x2,x3)(x1+x2+x3);
x1=0:0.1:1;
x2=0:0.1:1;
x3=0:0.1:1;
[X1,X2,X3]=ndgrid(x1,x2,x3);
Z=f(X1,X2,X3);
M=[X1,X2,X3,Z];
[~,idx]=sort(M(:,4));
sortedM=M(idx,:);
X1s=sortedM(1:t,1);
X2s=sortedM(1:t,2);
X3s=sortedM(1:t,3);
X=[X1s,X2s,X1s]
returns
X=
0 0 0
0.1000 0.1000 0.1000
0.2000 0.2000 0.2000
0.3000 0.3000 0.3000
0.4000 0.4000 0.4000
0.5000 0.5000 0.5000
0.6000 0.6000 0.6000
0.7000 0.7000 0.7000
0.8000 0.8000 0.8000
0.9000 0.9000 0.9000
1.0000 1.0000 1.0000