How can I 3d interpolate a function f: R^3 --> R^3 ?
2 views (last 30 days)
Show older comments
Juan Manuel Hussein Belda
on 26 Apr 2023
Commented: Juan Manuel Hussein Belda
on 30 Apr 2023
Hello! I have a table (which exceeds the limits for me to create a meshgrid) which is of the kind:
x | y | z | fx | fy | fz
This 3d function (f) has repeated coordinates x, y, z (i.e. for fixed x0, y0, I have a set of z data corresponding to different values of fx, fy, fz). I tried to do interp3 having done previously meshgrid, but it does not work because of the size of the table.
I would like to find fx*, fy*, fz* such that fx* = fx(x*, y*, z*) and so on. Is there anything I could use? Thank you! Sorry if I have not explained myself properly, but I will leave the structure of my data (a sample) below:
-5.0000000000000003e-02 -5.0000000000000003e-02 4.1000000000000002e-02 -7.9951927903984449e-02 -7.9759897837000562e-02 -1.1193510633877023e-01
-5.0000000000000003e-02 -5.0000000000000003e-02 4.3000000000000003e-02 -7.5687538049114461e-02 -7.5592329497165670e-02 -8.9776172707900920e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 4.4999999999999998e-02 -7.0232531995898836e-02 -7.0632301003499667e-02 -7.3634053337554600e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 4.7000000000000000e-02 -6.6907808923732423e-02 -6.6544534197885738e-02 -6.1247548082081459e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 4.9000000000000002e-02 -6.2484890058519191e-02 -6.2255531287406893e-02 -4.9515426185261224e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 5.1000000000000004e-02 -5.8593779138299981e-02 -5.8438306650002582e-02 -4.0830627034238218e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 5.3000000000000005e-02 -5.5154062309008045e-02 -5.5049344468960537e-02 -3.3614960591879316e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 5.5000000000000000e-02 -5.2090952480478875e-02 -5.2296541426410242e-02 -2.7436886121766587e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 5.7000000000000002e-02 -4.8544831459857732e-02 -4.8816933529787172e-02 -2.1615647420514614e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 5.9000000000000004e-02 -4.5761096787988530e-02 -4.5943899781619980e-02 -1.7736320662827522e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 6.0999999999999999e-02 -4.3062395376749614e-02 -4.3205396827530287e-02 -1.4170468367842259e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 6.3000000000000000e-02 -4.0640523197885893e-02 -4.0627899289096873e-02 -1.0766430352291729e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 6.5000000000000002e-02 -3.8189262345860293e-02 -3.8219490083574281e-02 -8.0298102353285952e-03
-5.0000000000000003e-02 -5.0000000000000003e-02 6.7000000000000004e-02 -3.5955144233611472e-02 -3.5970625678796879e-02 -5.6854763066810868e-03
-5.0000000000000003e-02 -5.0000000000000003e-02 6.9000000000000006e-02 -3.3853227037183693e-02 -3.3881101361149191e-02 -3.5386491816855065e-03
-5.0000000000000003e-02 -5.0000000000000003e-02 7.1000000000000008e-02 -3.1948568830853293e-02 -3.2187847593221519e-02 -1.8015823999897010e-03
-5.0000000000000003e-02 -5.0000000000000003e-02 7.3000000000000009e-02 -3.0064361772382288e-02 -3.0424370683854146e-02 -3.2209933750105250e-04
0 Comments
Accepted Answer
John D'Errico
on 26 Apr 2023
This is a common problem, at least in the world of color modeling as I worked for many years. You will want to build 3 interpolant models, so essentially fx(x,y,z), fy(x,y,z), fz(x,y,z).
As long as the mapping is a 3d mapping, scatteredInterpolant is your best choice.
xyzuvw = [-5.0000000000000003e-02 -5.0000000000000003e-02 4.1000000000000002e-02 -7.9951927903984449e-02 -7.9759897837000562e-02 -1.1193510633877023e-01
-5.0000000000000003e-02 -5.0000000000000003e-02 4.3000000000000003e-02 -7.5687538049114461e-02 -7.5592329497165670e-02 -8.9776172707900920e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 4.4999999999999998e-02 -7.0232531995898836e-02 -7.0632301003499667e-02 -7.3634053337554600e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 4.7000000000000000e-02 -6.6907808923732423e-02 -6.6544534197885738e-02 -6.1247548082081459e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 4.9000000000000002e-02 -6.2484890058519191e-02 -6.2255531287406893e-02 -4.9515426185261224e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 5.1000000000000004e-02 -5.8593779138299981e-02 -5.8438306650002582e-02 -4.0830627034238218e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 5.3000000000000005e-02 -5.5154062309008045e-02 -5.5049344468960537e-02 -3.3614960591879316e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 5.5000000000000000e-02 -5.2090952480478875e-02 -5.2296541426410242e-02 -2.7436886121766587e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 5.7000000000000002e-02 -4.8544831459857732e-02 -4.8816933529787172e-02 -2.1615647420514614e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 5.9000000000000004e-02 -4.5761096787988530e-02 -4.5943899781619980e-02 -1.7736320662827522e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 6.0999999999999999e-02 -4.3062395376749614e-02 -4.3205396827530287e-02 -1.4170468367842259e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 6.3000000000000000e-02 -4.0640523197885893e-02 -4.0627899289096873e-02 -1.0766430352291729e-02
-5.0000000000000003e-02 -5.0000000000000003e-02 6.5000000000000002e-02 -3.8189262345860293e-02 -3.8219490083574281e-02 -8.0298102353285952e-03
-5.0000000000000003e-02 -5.0000000000000003e-02 6.7000000000000004e-02 -3.5955144233611472e-02 -3.5970625678796879e-02 -5.6854763066810868e-03
-5.0000000000000003e-02 -5.0000000000000003e-02 6.9000000000000006e-02 -3.3853227037183693e-02 -3.3881101361149191e-02 -3.5386491816855065e-03
-5.0000000000000003e-02 -5.0000000000000003e-02 7.1000000000000008e-02 -3.1948568830853293e-02 -3.2187847593221519e-02 -1.8015823999897010e-03
-5.0000000000000003e-02 -5.0000000000000003e-02 7.3000000000000009e-02 -3.0064361772382288e-02 -3.0424370683854146e-02 -3.2209933750105250e-04];
I would point out that your data is NOT amenable for a scattered interpolant. X and y are constant in this data, only z varies.
However, if I were to assume that x and y also vary, and that you have only posted the first 17 data points from your dataset, then you would do this:
umdl = scatteredInterpolant(xyzuvw(:,1),xyzuvw(:,2),xyzuvw(:,3),xyzuvw(:,4));
vmdl = scatteredInterpolant(xyzuvw(:,1),xyzuvw(:,2),xyzuvw(:,3),xyzuvw(:,5));
wmdl = scatteredInterpolant(xyzuvw(:,1),xyzuvw(:,2),xyzuvw(:,3),xyzuvw(:,6));
Now you can interpolate values for each of the outputs. I suppose you could batch them together, like this:
uvwpred = @(x,y,z) [umdl(x,y,z),vmdl(x,y,z),wmdl(x,y,z)];
More Answers (1)
See Also
Categories
Find more on Interpolation in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!