Speeding up to find minimum value using min() function

조회 수: 6 (최근 30일)
Michael Walter
Michael Walter 2022년 3월 17일
댓글: Michael Walter 2022년 3월 18일
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
Michael Walter
Michael Walter 2022년 3월 17일
편집: Michael Walter 2022년 3월 17일
c is round about 5000x1 and s is about 1x800.
The size is not the problem, but I have to repeat this function over and over again, because the current distribution will change the temperature and therefore the current characteristics. For a given time the temperature is assumed constant. After that period the temperature is calculated based on power losses and with that new temperature the new characteristics c is calculated. Then the function [a,b]=min(abs(c_new-s_new)) is called again.
The min function requires 85% of execution time
I have no c-compiler installed but I can install a compiler.
Jan
Jan 2022년 3월 17일
The size matters, because the creation of the intermediate matrix c-s is time consuming. Then the RAM access is the bottleneck.

댓글을 달려면 로그인하십시오.

채택된 답변

Bruno Luong
Bruno Luong 2022년 3월 18일
편집: Bruno Luong 2022년 3월 18일
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
Michael Walter
Michael Walter 2022년 3월 18일
편집: Michael Walter 2022년 3월 18일
Thank you.
I'm a newbie at Matlab forum. Is it possible to accept Jan's solution too?
Bruno Luong
Bruno Luong 2022년 3월 18일
No you can't accept multiple answers.

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Matt J
Matt J 2022년 3월 17일
c=c(:)';
b=interp1(c,1:numel(c),s,'nearest');
a=abs(c(b)-s)

Jan
Jan 2022년 3월 17일
편집: Jan 2022년 3월 17일
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
Elapsed time is 3.400639 seconds.
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
Elapsed time is 0.013202 seconds.
isequal(b, b2)
ans = logical
1
max(abs(a(:) - a2(:)))
ans = 0
  댓글 수: 4
Michael Walter
Michael Walter 2022년 3월 18일
편집: Michael Walter 2022년 3월 18일
Here are some input data. c1/s1 works with b2(b2==0)=1; c2/s2 has some measurment noise so that c2 isn't monotonically. c3/s3 is a special one, everything is zero. c3/s3 is for the case that i have only one resistor. I thought it's easier to calculate this state intead of using if statement.
Edit: I solved c2/s2 by manipulating the input data
Michael Walter
Michael Walter 2022년 3월 18일
Also a very good solution. Thank you

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 MATLAB에 대해 자세히 알아보기

태그

제품

Community Treasure Hunt

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

Start Hunting!

Translated by