Codegen and the "find" Function
15 views (last 30 days)
I'm writing a piece of Matlab code that will be used in a Simulink "Matlab Function" block, meaning that it will get run through the Matlab Coder.
When I use the "find" function, even when I know exactly the size that it's output is going to be, I can't store the answer in a fixed-size piece of memory because the Coder doesn't ever know what the output size is going to be.
Assume in the following code that we've already guaranteed that ind_vector is monotonically-increasing:
if query(i) < ind_vector(1)
locations(i) = 0;
location(i) = find(query(i)>=ind_vector,1,'last');
Because I've guaranteed that ind_vector is monotonically-increasing, I've checked for the condition that the query is lower than the whole vector (which is the only case that would make "find" return empty), and I've only asked find for a single output, I know that it will return a 1x1. The Coder does not know this, however, and considers the output a ?x1 and thus won't let me store it in a 1x1 slot.
Is there any way to prommise the Coder that this output is a specific size? I tried using assert, but it didn't work.
Mike Hosea on 6 Sep 2012
tmp = find(etc.);
location(i) = tmp(1);
However, FIND is pretty heavyweight for this. I prefer to write little helper functions to perform tasks like this because I can avoid creating a Boolean temporary array and because it avoids the variable sizing issue (since I can return 0 to mean "not found").