# how to define what a function is doing

8 views (last 30 days)
Niki on 2 Jun 2016
Commented: John D'Errico on 5 Jun 2016
I have a function that I am trying to convert to another language. Th problem is that I cannot run this because it gives me an error saying that
Error in shiftinter (line 11)
global ff rr
Output argument "val" (and maybe others) not assigned
during call to
moreover, I cannot understand what exactly each part of the code is doing. I do understand that line by line but I don't understand the function. Is there anyone who can help me to get this function run ?
to assume the input for example can be
sol = 1:100;
myop= 100:200;
function [sol,val] = function(sol, myop)
global ff rr
inter = round(sol(1)); % interpolation
sid = round(sol(2)); % sideways movement
% interpolation
if length(ff) > 0
step = (length(ff)+ inter)/(length(rr));
fff = interp1(ff,[1:step:length(ff)]);
if length(fff) >= length(rr)
fff = fff(1:length(rr));
elseif length(fff) < length(rr)
diff = length(rr)-length(fff);
fff = [fff ones(1,diff)*ff(length(ff))];
end
else
return
end
% sideways movement
if length(fff) > 0
if sid > 0
sidtill = ones(1,sid)*fff(1);
ffff = [sidtill fff(1:(length(fff) - sid))];
elseif sid <= 0
sid = abs(sid);
sidtill = ones(1,sid)*ff(length(ff));
ffff = [fff((sid+1):length(fff)) sidtill];
end
else
return
end
% scaling
rrs = real(rr)./max(real(rr));
fffs = real(ffff)./max(real(ffff));
% Evaluation by correlation coefficient --------------------
if (norm(rrs-mean(rrs)))*(norm(fffs-mean(fffs))) == 0
cc = -1e10;
else
cc = ((rrs-mean(rrs))*(fffs-mean(fffs))')/((norm(rrs-mean(rrs)))*(norm(fffs-mean(fffs))));
end
val = cc;
return
John D'Errico on 5 Jun 2016
Yet another case study in why global variables are unnecessary, poor programming practice, and a breeding ground for bugs.

Walter Roberson on 2 Jun 2016
function [sol,val] = function(sol, myop)
With sol appearing on both the left and the right, it is not necessary to assign to sol inside the routine: the input value will be copied to output. Provided, that is, that input was actually passed. So the fact you do not assign to sol is not the problem.
However, look more carefully at your code. You assign to val but only at the very bottom of the function. If your function returns early before reaching that line then nothing will have been assigned to val . Your code will execute a return if length(ff) == 0, or if length(fff) == 0 and it will do so without having assigned to val . You need to repair that.
Your ff is a global variables. One reason it could be empty is if you did not assign anything to it as global variables before calling the routine.

Image Analyst on 3 Jun 2016
Edited: Image Analyst on 3 Jun 2016
Several problems. The most glaring is that you called your function "function":
function [sol,val] = function(sol, myop)
function is a reserved keyword and you should not use it as the name of one of your custom functions. Call it CalculateSol or something descriptive, but definitely not function.
The second is that for some reason you return before you ever assign val. The solution to that can definitely be determined after you follow this link. One thing you should always to is to assign all your output variables immediately after entering your function, even if it's to just assign null or something:
sol = pi; % Some default.
val = []; % Null or -1 or whatever you want.
So if you return at least it has something. Hopefully you will then inspect the return values for validity and if they're null or something, take appropriate action.
The next problem is you have a script (the first two lines of code) followed by a function in (presumably) the same m-file. You can't do that. To have more than one function in a file, you must declare the script as a function, like if your m-file is test.m, you must have all this in test.m this:
function test()
sol = 1:100;
myop= 100:200;
% Call it
[sol,val] = CalculateSol(sol, myop)
function [sol,val] = CalculateSol(sol, myop)
% Code for CalculateSol.....
So now you have two functions, which is allowed, instead of a script and a function, which is not allowed.
Image Analyst on 5 Jun 2016
You can use normalized cross correlation to align signals. See normxcorr2() if you have the Image Processing Toolbox. I think it should also work for 1-D signals as well as 2-D images (like in my attached demo).

Stalin Samuel on 2 Jun 2016
• Your function has two return variables(sol,val).
• But you have assigned value for only one variable(val = cc)
• The error message states that "value of one or more output variables are not assigned"
• If you think variable 'val' alone fulfill your requirements then you can remove the variable 'sol'
• otherwise you must assign a value to 'sol' within the function
##### 2 CommentsShowHide 1 older comment
Stalin Samuel on 2 Jun 2016
if you run the above code probably you will get the error "Function definitions are not permitted in this context."