필터 지우기
필터 지우기

How can I 3d interpolate a function f: R^3 --> R^3 ?

조회 수: 2 (최근 30일)
Juan Manuel Hussein Belda
Juan Manuel Hussein Belda 2023년 4월 26일
댓글: Juan Manuel Hussein Belda 2023년 4월 30일
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

채택된 답변

John D'Errico
John D'Errico 2023년 4월 26일
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));
ans = 1×2
17 6
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)];
  댓글 수: 1
Juan Manuel Hussein Belda
Juan Manuel Hussein Belda 2023년 4월 30일
Thank you so much! That is a very good detailed option. It worked great, but I just ended up reshaping the table since it is ordered and then using interp3 because it worked faster :)

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

KSSV
KSSV 2023년 4월 26일
  댓글 수: 1
Juan Manuel Hussein Belda
Juan Manuel Hussein Belda 2023년 4월 30일
Thank you! That option worked good, but I ended up working with reshape because it was faster, that is great!

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Interpolation에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!

Translated by