Мне нужна помощь, чтобы ускорить созданную мной функцию для исправления элементов x
и y
на основе положения препятствий.
Я лучше объясняю свою функцию на одном примере только в x
направление (это означает 1D пример).Предположим, у меня есть значения x
и Geometry
как
x = [1.8;3.4;4.2;6.3;6.4;8.6;9.1];
Geometry = [0;1;1;0;1;0;1;1;0;0]; % the value 1 means obstacle
Так что, если я сделаю find(Geometry)
, я получу положение препятствий.Затем функция корректирует положение на основе элементов x
, которые больше, чем положение препятствий.Так, например, x(1)
не исправлено, потому что его положение не превышает любое препятствие.Но x(2)
будет исправлено двумя Geometry
элементами, поэтому Corrected_x(2) = 3.4 - 2
.Ответ этого примера:
Corrected_x = [1.8;1.4;2.2;3.3;3.4;3.6;4.1];
Обратите внимание, что последний элемент x
исправлен на 5, потому что значение больше, чем положение 5 препятствий, присутствующих в Geometry
.
Пока что я написал функцию, которая делает это в 2D и дает мне желаемый результат, но это занимает слишком много времени.Проблема в том, что геометрия - это матрица MxN
, которую мне нужно пройти через каждую строку и столбец, поскольку препятствия находятся в разных позициях в каждой строке или столбце.Функция занимает слишком много времени из-за циклов, проходящих через каждую строку и столбец, а также из-за того, что x
и y
являются большими массивами.
Есть идеи, чтобы ускорить это?
function [Corrected_x, Corrected_y]= PositionCorrection(x, y, Geometry)
yRange = floor(min(y)):ceil(max(y));
xRange = floor(min(x)):ceil(max(x));
nY = length(yRange); % nRows
nX = length(xRange); % nCols
%% Save in cell arrays the x and y elements within the ranges
xPositionCorrected = cell(nY-1,1);
yPositionCorrected = cell(nX-1,1);
% Remember the order of the elements
Rememberpositionx = cell(nY-1,1);
Rememberpositiony = cell(nX-1,1);
%% Loop of search and correction of x elements
for iY = 1:nY-1
% x elements within yRange
xinBinY = x(y(:)>yRange(iY) & y(:)<yRange(iY+1));
[~,xObstacle] = find(Geometry(iY,:)); % xPosition of the obstacle
[~,Rememberpositionx{iY,1}] = ismember(xinBinY,x);
% Correction
if isempty(xinBinY)
xPositionCorrected{iY,1} = [];
elseif isempty(xObstacle)
xPositionCorrected{iY,1} = xinBinY;
else
matrixCorrectedResults = bsxfun(@gt, xinBinY,xObstacle);
xCorrection = sum(matrixCorrectedResults,2);
xPositionCorrected{iY,1} = xinBinY-xCorrection;
end
end
%% Loop of search and correction of y elements
for iX = 1:nX-1
% y elements within xRange
yinBinX = y(x(:)>xRange(iX) & x(:)<xRange(iX+1));
[yObstacle,~] = find(Geometry(:,iX));
[~,Rememberpositiony{iX,1}] = ismember(yinBinX,y);
if isempty(yinBinX)
yPositionCorrected{iX,1} = [];
elseif isempty(yObstacle)
yPositionCorrected{iX,1} = yinBinX;
else
matrixCorrectedResults = bsxfun(@gt, yinBinX,yObstacle.');
yCorrection = sum(matrixCorrectedResults,2);
yPositionCorrected{iX,1} = yinBinX-yCorrection;
end
end
%% Get the original order
xPositionCorrected(all(cellfun('isempty', xPositionCorrected),2),:) = [];
Rememberpositionx(all(cellfun('isempty',Rememberpositionx),2),:) = [];
yPositionCorrected(all(cellfun('isempty', yPositionCorrected),2),:) = [];
Rememberpositiony(all(cellfun('isempty',Rememberpositiony),2),:) = [];
% x
Lx = 1:length(x);
Corrected_x = cell2mat(xPositionCorrected);
idx = cell2mat(Rememberpositionx);
[~,idtemp] = ismember(Lx,idx);
Corrected_x = Corrected_x(idtemp);
% y
Corrected_y = cell2mat(yPositionCorrected);
idy = cell2mat(Rememberpositiony);
[~,idtemp] = ismember(Lx,idy);
Corrected_y = Corrected_y(idtemp);
end