Команда dsearchn () замедляет мой алгоритм, есть ли лучшее решение?MATLAB - PullRequest
0 голосов
/ 26 октября 2018

Я использую следующий код для расчета высоты.

Data = [Distance1',Gradient];

Result = Data(dsearchn(Data(:,1), Distance2), 2); 

Altitude = -cumtrapz(Distance2, Result)/1000;

Расстояния 1 и 2 имеют разные размеры с одинаковыми значениями, поэтому я сравниваю их, чтобы получить соответствующее значение градиента для использования с расстоянием 2.

Чтобы выполнить эти 3 строки, Matlab требуется от 12 до 15 секунд. Что замедляет весь мой алгоритм.

Есть ли лучший способ, как я могу выполнить вышеуказанные действия, не замедляя мой алгоритм?

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Мне удается найти альтернативный метод с помощью функции interp1.

Вот пример кода.

Distance2= [1:10:1000]';
Distance1= [1:1:1000]';
Gradient= rand(1000,1);
Data= [Distance1,Gradient];
interp1(Distance1,Data(:,2),Distance2,'nearest');

Эта функция добавляет всего 1 секунду к моему исходному времени симуляции, что намного лучше, чем предыдущие 12-15 секунд.

0 голосов
/ 26 октября 2018

Если я правильно понимаю, вы ищете первое вхождение числа Distance2 в столбце Data (:, 1). Вы можете выполнить примерно в 3 раза быстрее, используя find. Попробуйте:

k = find(Data(:,1) == Distance2,1);
Result = Data(k,2);

Вот временной тест, где pow - длина ваших данных (10 ^ pow для 10000 строк), а fac - увеличенный коэффициент скорости для использования find

pow = 5;
data = round(rand(10^pow,1)*10);
funcFind = @() find(data == 5,1);
timeFind = timeit(funcFind);
funcD =  @() dsearchn(data,5);
timeD = timeit(funcD);
fac = timeD/timeFind
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...