Creating new vectors containing values based on for loop outcome.
이 질문을 팔로우합니다.
- 팔로우하는 게시물 피드에서 업데이트를 확인할 수 있습니다.
- 정보 수신 기본 설정에 따라 이메일을 받을 수 있습니다.
오류 발생
페이지가 변경되었기 때문에 동작을 완료할 수 없습니다. 업데이트된 상태를 보려면 페이지를 다시 불러오십시오.
이전 댓글 표시
I would like to create a new vector which contains values from b which correspond to the closest values from a. I mainly code in python and am new to Matlab. The only thing i can think of at the moment is an if statement which i know would most likely be inefficient. Essentially i would need to create new vectors for each value in a. The following is my code. Any help is greatly appreciated, thanks in advance.
a=[1250 2320 3520 7650];
b= [3700 6766 8888 1212 2000 5555 9998 3000];
vals=zeros(7,1);
n=1;
for i = b
differences = abs(a-i);
[minDiff, indexOfMinDiff] = min(differences);
closestValue = a(indexOfMinDiff);
vals(n)= closestValue;
n=n+1;
end
edges = unique(vals)
counts = histc(vals(:), edges)
채택된 답변
vals=interp1(a,a,b,'nearest','extrap');
For above a,b:
>> vals
vals =
3520.00 7650.00 7650.00 1250.00 7650.00 7650.00 3520.00
>>
댓글 수: 10
Michael Abram
2020년 12월 31일
편집: Michael Abram
2020년 12월 31일
Thank you, is this to find the closest value to the b values in a, if so is there a way of creating a vector with all values from a which correspond to the nearest b value?
So in this case there would be two vectors, for 3520 and 7650.
Say what? Don't follow why "two vectors"...there are four values in a, why only two referred to?
I made a mistake in the comment, but ideally four vectors would be created, one for each value in a, and these vectors would contain the corresponding values from b.
K>> interp1(b,b,a,'nearest','extrap')
ans =
1212.00 3000.00 3700.00 6766.00
K>>
I don't know what four vectors you would want; the result is a 4-vector (=numel(a)) of the corresponding nearest value from b.
Creating four variables where one array will do is not "the MATLAB way" if that is the idea.
I need to find the mean value of all the b values closest to the same number in a, is there a way of doint this in MATLAB?
I don't understand what that means...the mean of the closest is just the closest value.
Illustrate what you think the answer should be and explain why. If you can clearly define the problem, of course MATLAB can be programmed to return the answer.
Michael Abram
2021년 1월 1일
편집: Michael Abram
2021년 1월 1일
If i have four numbers, 1000, 1200, 1400, 1600, and the closest number to all these in an alternate vector is 1500, i would like to find the mean of all these numbers. The code i am building is to perform k means clustering.
Don't try to be so terse -- this isn't Twitter.
Show what you would want the result to be from your original a,b and how this relates to the original Q? as asked and the desire for four elements.
It's all too disjointed to see the big picture of what you have and what you want.
You are aware there is a kmeans function in the MATLAB Statistics Toolbox, I presume...instead of reinventing the wheel?
Michael Abram
2021년 1월 1일
편집: dpb
2021년 1월 2일
I apologise, my description of what i wanted was extremely basic and i have finally managed to create the correct code. I apologise if i have wasted your time and am extremely thankful to you for taking the time to help me. The code to check the nearest value you gave me was extremely helpful. As you can see, the cent1 array contains the mean values of all the X values which share the same closest value in Incent1. I am aware of the kmeans function however i believe the problem i have been set involves creating my own kmeans function.
filename = 'Centroids.txt';
[inCent,delimiterOut]=importdata(filename);
filename = 'EPdata.txt';
[X,delimiterOut]=importdata(filename);
X1 = X.';
inCent1 = inCent.';
vals=interp1(inCent1,inCent1,X1,'nearest',"extrap");
n=1;
cent1=[];
for i = inCent1
k = find(vals==i);
l=length(k);
y=X(k);
s=sum(y)/l;
cent1(n)=s;
n=n+1;
end
cent1
filename = 'Centroids.txt';
[inCent,delimiterOut]=importdata(filename);
filename = 'EPdata.txt';
[X,delimiterOut]=importdata(filename);
vals=interp1(inCent,inCent,X,'nearest',"extrap");
n=0;
cent=zeros(numel(inCent),1);
for i = inCent.'
n=n+1;
cent(n)=mean(X(vals==i));
end
removing duplicated variables; only transposing where needed and eliminate unnecessary temporaries and the explicit find for the logical addressing vector.
Alernatively, can eliminate the explicit loop with
filename = 'Centroids.txt';
[inCent,delimiterOut]=importdata(filename);
filename = 'EPdata.txt';
[X,delimiterOut]=importdata(filename);
vals=interp1(inCent,inCent,X,'nearest',"extrap");
cent=arrayfun(@(i) mean(X(X==vals)),vals);
NB: air code, untested....
추가 답변 (0개)
카테고리
도움말 센터 및 File Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!웹사이트 선택
번역된 콘텐츠를 보고 지역별 이벤트와 혜택을 살펴보려면 웹사이트를 선택하십시오. 현재 계신 지역에 따라 다음 웹사이트를 권장합니다:
또한 다음 목록에서 웹사이트를 선택하실 수도 있습니다.
사이트 성능 최적화 방법
최고의 사이트 성능을 위해 중국 사이트(중국어 또는 영어)를 선택하십시오. 현재 계신 지역에서는 다른 국가의 MathWorks 사이트 방문이 최적화되지 않았습니다.
미주
- América Latina (Español)
- Canada (English)
- United States (English)
유럽
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
