Speeding up to find minimum value using min() function
6 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Michael Walter
am 17 Mär. 2022
Kommentiert: Michael Walter
am 18 Mär. 2022
Hi,
I have to calculate the current distribution of two nonlinear resistors. To do that I’m searching for the closest index and value of an array.
For example.
[a,b]=min(abs(c-s))
c is an n x 1 array. c increases monotonically
c represents the characteristics of the resistors.
s is a 1 x m array and sinusoidal shaped
s represents the impressed current.
With index b I calculate the voltage drop and the current of each resistor.
Any suggestions to speed up the code?
5 Kommentare
Jan
am 17 Mär. 2022
The size matters, because the creation of the intermediate matrix c-s is time consuming. Then the RAM access is the bottleneck.
Akzeptierte Antwort
Bruno Luong
am 18 Mär. 2022
Bearbeitet: Bruno Luong
am 18 Mär. 2022
Alternative way
% Fake data
c=cumsum(rand(1,10000));
s=c(end)*rand(1,10000);
cpad = [-Inf c Inf];
b = discretize(s,cpad);
b = b -1 + (cpad(b)+cpad(b+1)<2*s);
a = c(b);
5 Kommentare
Weitere Antworten (2)
Jan
am 17 Mär. 2022
Bearbeitet: Jan
am 17 Mär. 2022
c = c(:); % Make it a column vector to be sure
nc = numel(c);
bin = [c(1); (c(1:nc-1) + c(2:nc)) * 0.5; c(nc)];
[~, idx] = histc(s, bin);
value = abs(c(idx) - s(:));
bin contains the start point, midpoints and final point of the intervals of c.
histc uses a binary search to find the index of the value in c for each element of s. This avoids to create the large matrix c - s. Unfortunately MathWorks decided to replace the working histc by histcounts, which has some performance problems.
See also: interp1('nearest')
c = linspace(0, 1, 1e4);
s = rand(1, 1e5);
tic;
[a, b] = min(abs(c(:) - s(:).'));
toc
tic;
c = c(:);
nc = numel(c);
bin = [c(1); (c(1:nc-1) + c(2:nc)) * 0.5; c(nc)];
[~, b2] = histc(s, bin);
% Alternative, seems to be faster:
% [~, ~, b2] = histcounts(s, bin);
a2 = abs(c(b2) - s(:));
toc
isequal(b, b2)
max(abs(a(:) - a2(:)))
4 Kommentare
Siehe auch
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
