Output argument ‹variable› (and maybe others) not assigned during call to ‹function›

1 view (last 30 days)
When I run my script, I get this error from my function. I can't see why
This is my function:
function pdf = apost(m);
sd1 = 300^2;
A = sd1*ones(1,12);
C_m = diag(A);
Cm = inv(C_m);
sd2 = 1;
B = sd2*ones(1,12);
C_d = diag(B);
Cd = inv(C_d);
[N,~] = size(m);
if N==5
Cm = inv(C_m);
Cd = inv(C_d);
m0 = [210.540977721001,336.865564353602,437.925233659682,516.527198675522,572.671459401123,599.339983245783,595.129163691363,574.075065919263,523.545231266222,442.136053214102,305.986220954521,179.661634321921];
g = [-5.57961065006546,-9.24249212739290,-13.3900010001821,-17.3638621584906,-20.6030599093808,-22.2586614660132,-21.9922416252264,-20.6883184326565,-17.7504996477641,-13.5862938793517,-8.19100512552534,-4.94137181487074]
y = [-15.0 -24.0 -31.2 -36.8 -40.8 -42.7 -42.4 -40.9 -37.3 -31.5 -21.8 -12.8];
L = (y-g)'.*C_d.*(y-g);
rho = (m-m0)'.*Cm.*(m-m0);
sigma = -0.5.*(rho + L);
else
disp('Incorrect dimension of input vector')
end
This is my script:
% (4) Metropolis algorithm
K = 10000; %Number of samples
pts = zeros(length(m0),K); %Array with sample output points
hfuncval = zeros(1,K); %Array with function value outputs
pts(:,1) = m0; %Set starting points
hfuncval(1) = apost(pts(:,1)); %Compute function in starting point
step = 0.5; %Set step length
return
%Start sampling
for k = 2:K
ptpert = pts(:,k-1) + (2*rand(12,1)-1)*step; % propose perturbed point
hfuncpert = sigma(ptpert); % Compute function in perturbed point
u = rand; % Generate random number in [0,1]
if u < hfuncpert/hfuncval(k-1) % accepting new points
% if u < exp(log(hfuncpert)-log(hfuncval(k-1)))
pts(:,k) = ptpert;
hfuncval(k) = hfuncpert;
else % Rejecting new points
pts(:,k) = pts(:,k-1);
hfuncval(k) = hfuncval(k-1);
end
end
  4 Comments
Guillaume
Guillaume on 9 Jan 2020
Edited: Guillaume on 9 Jan 2020
For the line
hfuncval(1) = apost(pts(:,1)
which assigns a value to the scalar hfuncval, the function apost must return a scalar.
The error tells you it doesn't (I suspect it returns a vector the same size as pts(:, 1) so 12x1, but we don't know since you haven't shown us what pdf is).
You need to modify apost so it returns a scalar even when it gets a vector as input, or change that line so it doesn't attempt to store a vector in a scalar.
Rik
Rik on 9 Jan 2020
Just as a side note: this question is related to the previously posted question.

Sign in to comment.

Answers (1)

Allen
Allen on 9 Jan 2020
Currently, you have only decleared pdf as an output argument at the start of your function, but have neglected to assign a value to it within the function. You need to define pdf somewhere within your function.
function pdf = apost(m);
sd1 = 300^2;
A = sd1*ones(1,12);
C_m = diag(A);
Cm = inv(C_m);
sd2 = 1;
B = sd2*ones(1,12);
C_d = diag(B);
Cd = inv(C_d);
[N,~] = size(m);
if N==5
Cm = inv(C_m);
Cd = inv(C_d);
m0 = [210.540977721001,336.865564353602,437.925233659682,516.527198675522,572.671459401123,599.339983245783,595.129163691363,574.075065919263,523.545231266222,442.136053214102,305.986220954521,179.661634321921];
g = [-5.57961065006546,-9.24249212739290,-13.3900010001821,-17.3638621584906,-20.6030599093808,-22.2586614660132,-21.9922416252264,-20.6883184326565,-17.7504996477641,-13.5862938793517,-8.19100512552534,-4.94137181487074]
y = [-15.0 -24.0 -31.2 -36.8 -40.8 -42.7 -42.4 -40.9 -37.3 -31.5 -21.8 -12.8];
L = (y-g)'.*C_d.*(y-g);
rho = (m-m0)'.*Cm.*(m-m0);
sigma = -0.5.*(rho + L);
%pdf = 'Assign value during this case'
else
disp('Incorrect dimension of input vector')
%pdf = 'This case might require a different value for pdf. eg - pdf = [];
end
end

Categories

Find more on Mathematics 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!