I have a data set in four variables (alpha,beta,gamma,lambda).
Here alpha is a 10 element vector, beta is a 8 element vector, both gamma and lambda have four values each.
The data is given such that for each value of lambda, there are 4 tables, and those 4 tables correspond to each value of gamma. Each of those four tables is a 8x10 matrix whose rows correspond to values of beta and columns correspond to values of alpha.
I tried to implement it this way (sample code using random values):
alpha = 1:10;
beta = 1:8;
gamma = 1:4;
lambda = 1:4;
m = length(beta);
n = length(alpha);
Data(:,:,1,1) = rand(m,n); % alpha in first dimension, beta is 2nd dimension, gamma in 3rd and lambda in 4th
Data(:,:,2,1) = rand(m,n);
Data(:,:,3,1) = rand(m,n);
Data(:,:,4,1) = rand(m,n);
Data(:,:,1,2) = rand(m,n);
Data(:,:,2,2) = rand(m,n);
Data(:,:,3,2) = rand(m,n);
Data(:,:,4,2) = rand(m,n);
Data(:,:,1,3) = rand(m,n);
Data(:,:,2,3) = rand(m,n);
Data(:,:,3,3) = rand(m,n);
Data(:,:,4,3) = rand(m,n);
Data(:,:,1,4) = rand(m,n);
Data(:,:,2,4) = rand(m,n);
Data(:,:,3,4) = rand(m,n);
Data(:,:,4,4) = rand(m,n);
idat = interpn(alpha,beta,gamma,lambda,Data,1,2,3,4);
Error using griddedInterpolant
Sample points vector corresponding to grid dimension 1 must contain 8 elements.

Error in interpn (line 149)
F = griddedInterpolant(X, V, method,extrap);
This code gives me errors. How can I resolve it? Do I need to create an n-dimensional grid? or am I making some mistake in the making of 4D tables.

 Accepted Answer

Voss
Voss on 5 Feb 2023
Edited: Voss on 5 Feb 2023
Swap your definitions of m and n (or equivalently use rand(n,m)). Like you said, alpha is 1st dimension, beta is 2nd.
alpha = 1:10;
beta = 1:8;
gamma = 1:4;
lambda = 1:4;
m = length(alpha);
n = length(beta);
Data(:,:,1,1) = rand(m,n); % alpha in first dimension, beta is 2nd dimension, gamma in 3rd and lambda in 4th
Data(:,:,2,1) = rand(m,n);
Data(:,:,3,1) = rand(m,n);
Data(:,:,4,1) = rand(m,n);
Data(:,:,1,2) = rand(m,n);
Data(:,:,2,2) = rand(m,n);
Data(:,:,3,2) = rand(m,n);
Data(:,:,4,2) = rand(m,n);
Data(:,:,1,3) = rand(m,n);
Data(:,:,2,3) = rand(m,n);
Data(:,:,3,3) = rand(m,n);
Data(:,:,4,3) = rand(m,n);
Data(:,:,1,4) = rand(m,n);
Data(:,:,2,4) = rand(m,n);
Data(:,:,3,4) = rand(m,n);
Data(:,:,4,4) = rand(m,n);
idat = interpn(alpha,beta,gamma,lambda,Data,1,2,3,4);
disp(idat)
0.7127
Edit to show that the interpolated value matches the input table:
Data(1,2,3,4)
ans = 0.7127

7 Comments

You're right. But, I actually followed the 2D interpolation first. Like I said, that the matrices have size 8 by 10, where the rows correspond to beta and columns correspond to alpha. If I ignore 3rd and 4th dimensions for now. Then, the following code works
alpha = 1:10;
beta = 1:8;
m = length(beta);
n = length(alpha);
Data = rand(m,n);
idat = interp2(alpha,beta,Data,1,2)
idat = 0.7148
However, if I were to swap the dimensions in this case:
alpha = 1:10;
beta = 1:8;
m = length(alpha);
n = length(beta);
Data = rand(m,n);
idat = interp2(alpha,beta,Data,1,2)
Error using griddedInterpolant
Sample points vector corresponding to grid dimension 1 must contain 8 elements.

Error in interp2>makegriddedinterp (line 226)
F = griddedInterpolant(varargin{:});

Error in interp2 (line 126)
F = makegriddedinterp({X, Y}, V, method,extrap);
then I get the same error.
Also, if you print the corresponding data table value from your solution
Data(1,2,3,4)
The interpolated value corresponds to a value for beta = 1 and alpha = 2 whereas I wanted the value corresponding to alpha = 1 and beta = 2
You can also check the documentation of interp2. It says "The default grid points cover the rectangular region, X=1:n and Y=1:m, where [m,n] = size(V)."
From the interp2 documentation:
"If X and Y are grid vectors, then V must be a matrix containing length(Y) rows and length(X) columns."
From the interpn documentation:
"If X1,X2,...,Xn are grid vectors, then V is an array whose ith dimension is the same length as grid vector Xi, where i= 1,2,...n."
So interp2 is reversed relative to what you'd expect going by how interpn works.
Also, Data(1,2,3,4) matches the result from interpn. I've edited my answer to show that.
Yes, you're actually right. Thank you for your help.
You're welcome.

Sign in to comment.

More Answers (0)

Categories

Find more on Interpolation in Help Center and File Exchange

Products

Release

R2021a

Asked:

on 5 Feb 2023

Commented:

on 5 Feb 2023

Community Treasure Hunt

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

Start Hunting!