How can I 3d interpolate a function f: R^3 --> R^3 ?
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Juan Manuel Hussein Belda
am 26 Apr. 2023
Kommentiert: Juan Manuel Hussein Belda
am 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 Kommentare
Akzeptierte Antwort
John D'Errico
am 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)];
Weitere Antworten (1)
Siehe auch
Kategorien
Mehr zu Interpolation finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!