Size mismatch error when trying to find a row in an array that is the same as a variable vector.

idx = find(all(waypoints == target, 2), 1);
So this is a line of code in a function of a simulink function block.
The array waypoints is just an array with two columns and any amount of rows.
I'm trying to find the index at which the [2 x 1] vector target is equal to a row within the waypoints array.
But when the simulation is run, it tells me there is a size mismatch where I first try to define idx. Surely they don't need to match as the purpose is just to find where one of waypoints rows are equal to target?
function targetnew = setwaypoint(d2w,target,accuracy)
waypoints = [100 150; 200 400; 175 275; 600 300]; % pre-defined waypoints (in the future imported as a large array from an external source.
if isempty(target)
target = waypoints(1,:); % initializes the first waypoint.
end
idx = find(all(waypoints == target, 2), 1); % find the first row that match
if isempty(idx) % no row found!
error('could not find target in the waypoints');
end
if d2w > accuracy
idx = idx + 1; % if target waypoint is reached, add one to index.
end
if idx > size(waypoints, 1) % attempt to avoid any issues if simulation time is greater than time taken to reach final waypoint.
targetnew = waypoints(end, :);
else
targetnew = waypoints(idx, :);
end
end

2 commentaires

Have you considered ismembertol() with the 'rows' option ?
I never knew about this, but using ismember with 'rows' worked, thank you. I'm still having issues but they're unrelated to this specific issue now so I'll post it in a new question.

Connectez-vous pour commenter.

Réponses (1)

The problem is here.
If target is 1x2 and waypoints is nx2, you can't do waypoints==target
waypoints = [100 150; 200 400; 175 275; 600 300];
target=[]
if isempty(target)
target = waypoints(1,:); % initializes the first waypoint.
end
waypoints==target

4 commentaires

How can I make matlab pick out the index of the array waypoints where the row is equal to the vector target then?
It looks like you want to match a 1x2 target to a row of a nx2 waypoints. Assume the floating point equality comparison is not an issue, you can try this with the example above.
idx = find(~all(waypoints-target, 2), 1)
If you are using R2018b as indicated, you should have no error running this:
waypoints = [100 150; 200 400; 175 275; 600 300];
target=[200 400];
idx = find(~all(waypoints-target, 2), 1)
idx =
2

Connectez-vous pour commenter.

Catégories

En savoir plus sur Manual Performance Optimization dans Centre d'aide et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by