Data is not valid NDGRID format. /Interpn

10 views (last 30 days)
Brian Cooper
Brian Cooper on 4 Apr 2018
Commented: Walter Roberson on 6 Apr 2018
I am having great difficulty with a particular usage of interpn(), despite using it with no problems throughout an App Designer application. The code is very large, but I managed to replicate the problem in the ~ 100 line script below. Everything before line 72 is just setting up parameters, the problem is between lines 72 to 79.
The problem is the interpn() call on line 79. If I replace the definition of AdvanceRatio (line 72) with the commented text, I get an error on line 79 indicating 'AdvanceRatioRow' is not valid NDGRID format. The subfunction griddedInterpolant is what throws the error.
I am stumped. If you evaluate both definitions of AdvanceRatio on line 72, they are (74,1) arrays of type double, identical to the precision of doubles. But one kills line 79, and the other works as intended. Guess which I need?
Where's Waldo...
Table_Cp_table = [0.032 0.084 0.098 0.138 0.206 0.25;...
0.029 0.075 0.094 0.132 0.198 0.242;...
0.025 0.066 0.088 0.128 0.188 0.233;...
0.022 0.058 0.08 0.12 0.178 0.223;...
0.009 0.045 0.07 0.11 0.163 0.214;...
-0.057 0.01 0.05 0.099 0.15 0.204;...
-0.188 -0.074 0.02 0.078 0.13 0.19;...
-0.338 -0.188 -0.04 0.04 0.105 0.175;...
-0.522 -0.338 -0.134 -0.017 0.07 0.15;...
-0.705 -0.525 -0.272 -0.11 0.023 0.118;...
-0.915 -0.726 -0.468 -0.248 -0.074 0.072;...
-1.092 -0.942 -0.717 -0.468 -0.254 0.019;...
-1.22 -1.12 -0.933 -0.741 -0.51 -0.059];
Table_Cp_x = [15 20 25 30 35 40];
Table_Cp_y = [0:0.2:2.4];
S = 10.81;
b = 9.3;
Cd0 = .02;
Clmax = 1.7;
eff = .6;
weight = 750;
RatedPower = 180;
RatedRPM = 2700;
D = 74/12;
Vne = 320;
ClminD = 0.3;
Clmin = -1;
MaxAlpha = 16;
MinAlpha = 10;
Gmax = 6;
Gmin = -5;
polar.alpha = [MinAlpha:1:MaxAlpha];
Clrate = (Clmax-Clmin)/(MaxAlpha/MinAlpha);
polar.Cl = Clrate.*(polar.alpha-MinAlpha)-Clmin;
polar.Cd = Cd0+(polar.Cl-ClminD).^2./(pi()*eff*b^2/S);
manPress = 29.92;
rho = 1.225; %ft, deg C
Output.AkroHorRho = rho;
Vcas = [10:10:Vne];
Vcas = Vcas./3.6;
theta = [-90:5:90]';
lengthTheta = length(theta);
Output.Pspecific = [];
posNLimit = min(Gmax,Clmax*rho*Vcas(1)^2*S/(2*g0*weight));
negNLimit = max(Gmin,Clmin*rho*Vcas(1)^2*S/(2*g0*weight));
Nzpos = [0:0.1:posNLimit];
Nzneg = [0:-0.1:negNLimit];
Nz = [flip(Nzneg),Nzpos]';
lengthNz = length(Nz);
repTheta = repmat(theta,lengthNz,1);
Nz = repelem(Nz,lengthTheta,1);
Vx = Vcas(1)*cosd(repTheta);
Vy = Vcas(1)*sind(repTheta);
rpm = ones(length(repTheta),1);
VmagUS = Vmag.*3.28;
rho = rho.*.0023769/1.225;
maxManifold = rho./.0023769.*29.92;
manPress = min(maxManifold,manPress);
P = RatedPower.*manPress./29.92.*rpm./RatedRPM;
n = RatedRPM*ones(length(repTheta),1)./60;
AdvanceRatio = 0.032832832832833*ones(size(VmagUS));%(n.*D).\VmagUS;
Cp = P.*550./(rho.*n.^3*D.^5);
AdvanceRatioRow = interpn(Table_Cp_y,Table_Cp_x,Table_Cp_table,AdvanceRatio,Table_Cp_x,'*linear');
[indexMesh, Table_Cp_xMesh] = ndgrid([1:length(Cp)]',Table_Cp_x);
%Data is poorly scaled so...
%Jrow = Jrow.*10;
%Cp=Cp.*10;
bladeAngle = interpn(indexMesh,AdvanceRatioRow,Table_Cp_xMesh,[1:length(Cp)]',Cp,'*linear');
  2 Comments
Brian Cooper
Brian Cooper on 5 Apr 2018
Does anyone know at a very low level, behind the scenes, if Matlab internally makes a distinction between a two dimensional matrix, vs a two dimensional array? Are they truly identical, down to bits in RAM/cache/register? I ask, because as I work through the math, I can see how one definition might result in a 'matrix', and the other in a bitwise generated array.
That is as far as my thinking takes me with this problem.
Walter Roberson
Walter Roberson on 5 Apr 2018
Everything is an array to MATLAB. Scalars (1 x 1 arrays), isscalar(), are special in some circumstances having to do with mixed sizes. Some mathematical operations only make sense on vectors, (1 x N or N x 1 arrays), isvector(). Some operations only make sense on matrices (2d arrays), ismatrix().
To emphasize: every N x M array is both a matrix and an array. There is no way of distinguishing "matrix" and "2d array".

Sign in to comment.

Answers (1)

Brian Cooper
Brian Cooper on 5 Apr 2018
I solved my own problem. I tested the two variables against each other (==) again, and although most rows are identical down the the bit, a sporadic few are not. interpn requires bitwise identical data, and my desire method does not provide that.
Here's the cultprit, if anyone cares to see:
VmagUS =
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111109e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111109e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111109e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111109e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111109e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111109e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111109e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111109e+00
9.111111111111111e+00
9.111111111111111e+00
9.111111111111111e+00
  1 Comment
Walter Roberson
Walter Roberson on 6 Apr 2018
It often helps to subtract two values assumed to be identical for testing, just to double check whether they really are identical.

Sign in to comment.

Categories

Find more on Creating and Concatenating Matrices in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!