MATLAB - Исправление на основе нескольких условий. Помогите ускорить функцию - PullRequest
0 голосов
/ 19 ноября 2018

Мне нужна помощь, чтобы ускорить созданную мной функцию для исправления элементов 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
...