Clear Filters
Clear Filters

Coder. Error due mismatched varying sizes

1 view (last 30 days)
Good evening. I made the function NEOEKF and then tried to convert to C++ with coder, but I got the following warning:
57 Size mismatch (size [:? x 1] ~= size [4 x 1]). Mismatched varying and fixed sizes indicate a probable run-time error. If this diagnostic is incorrect, use indexing to explicitly make the varying size fixed.
Does any one can support me how to fix it? Refer to line 57
Thank you in advance.
regards Willy
function [DIST,VEL,RB] = NEOEKF(dT,T2)
Mo = 030;
dT = 20;
T2 = 360;
Xs = [0 0 4 0];
yseg = 2025.371/3600;
F = [1 0 0 0;0 1 0 0;dT 0 1 0 ;0 dT 0 1];
dd= 100;
dve= 15;
P = [dd^2 0 0 0;
0 dd^2 0 0;
0 0 dve^2 0;
0 0 0 dve^2];
v = 0.5;
R = pi/180*v^2;
X = [];
X = [15000*sin(Mo*pi/180) 15000*cos(Mo*pi/180) 0 0]';
I=eye(4);
Q = 15*[0.5*dT^3 0 0.25*dT^4 0;0 0.5*dT^3 0 0.25*dT^4;...
dT^2 0 0.5*dT^3 0;0 dT^2 0 0.5*dT^3];
DIST = size(T2);
VEL = size(T2);
RB = size(T2);
z = 30:0.4:34;
for k = 1:1:10
X(:,k+1) = F*X(:,k);
P_ = F*P*F'+ Q;
sx = X(1,k);
sy = X(2,k);
h = atan2(sx,sy);
if h<0
h = h + 2*pi;
elseif h>2*pi
h = h - 2*pi;
end
H = [sy/(sx^2 + sy^2) -sx/(sx^2 + sy^2) 0 0];
g = [cos(z(k))/(X(1)*sin(z(k))+ X(2,k+1)*cos(z(k))) -sin(z(k))/(X(1,k+1)*...
sin(z(k))+ X(2,k+1)*cos(z(k))) 0 0];
S = H*P_*H'+ R;
G = P_*H'/S;
X(:,k+1) = X(:,k+1)+ G*(z(k) - h); % Line 57
P =(I - G*g)*P_*(I - G*g)' + G*R*G';
DIST(k+1) = sqrt(X(1,k+1).^2 + X(2,k+1).^2);
VEL(k+1) = sqrt((X(3,k+1) + Xs(3)).^2 + (X(4,k+1) + Xs(4)).^2)/yseg;
RB(k+1) = atan2(X(3,k+1)+ Xs(3),X(4,k+1) + Xs(4))*180/pi;
RB(k+1) = round(RB(k+1));
if RB(k+1)<0
RB(k+1) = RB(k+1) + 360;
elseif RB(k+1) > 360;
RB(k+1) = RB(k+1) - 360;
end
X(:,k) = [X(:,k)];
end
  2 Comments
Image Analyst
Image Analyst on 4 Dec 2012
Guillermo, to get your code to show up on separate lines, you can highlight the code and click the {}Code icon to make it look like code. That is far better than double spacing your code. Give it a try. Edit, remove blank lines, highlight, then click {}Code and Save.
Guillermo Soriano
Guillermo Soriano on 4 Dec 2012
Good morning. I was not familiar with that tip. Initially appears all in one line, therefore I corrected with double line, but with your indication, look much better. Unfortunately the line number is not shown. Thank you very much for your support. Regards Guillermo

Sign in to comment.

Answers (1)

Walter Roberson
Walter Roberson on 4 Dec 2012
Your z values are not integral, so z(k) is not integral, and h is not integral, so z(k)-h is not integral. But you have G() at that expression. G appears to be an array rather than a function, so I do not understand why it does not complain about indexing at a non-integral value ?
  3 Comments
Guillermo Soriano
Guillermo Soriano on 4 Dec 2012
Good morning Walter. Thank you for your assistance. This an algorithm wich pretend to solve the parameters of a target with only bearings for tracking purpose using the well known Extended Kalman Filter. Therefore the z is the bearing as input for each iteration. But there was a warning that hte function "INPUT" can not be coded from matlab to C++ and therefore I modified to be as a integer. But the error is on line 57 refer to array X(:,k+1) = X(:,k+1)+ G*(z(k) - h); When I run the algorithm on Matlab, it works. But passing to C++, comes the error and can not be coded. Regards Guillermo
Walter Roberson
Walter Roberson on 4 Dec 2012
Do no extend your X array at run-time. Initialize it to be its final size as the very first time you assign to X, using zeros().

Sign in to comment.

Categories

Find more on MATLAB Coder in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!