How can I 3d interpolate a function f: R^3 --> R^3 ?
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Juan Manuel Hussein Belda
le 26 Avr 2023
Commenté : Juan Manuel Hussein Belda
le 30 Avr 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 commentaires
Réponse acceptée
John D'Errico
le 26 Avr 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)];
Plus de réponses (1)
Voir également
Catégories
En savoir plus sur Interpolation dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!