Creating new vectors containing values based on for loop outcome.

1 Ansicht (letzte 30 Tage)
Michael Abram
Michael Abram am 31 Dez. 2020
Bearbeitet: dpb am 2 Jan. 2021
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)

Akzeptierte Antwort

dpb
dpb am 31 Dez. 2020
Bearbeitet: dpb am 31 Dez. 2020
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 Kommentare
Michael Abram
Michael Abram am 1 Jan. 2021
Bearbeitet: dpb am 2 Jan. 2021
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
dpb
dpb am 2 Jan. 2021
Bearbeitet: dpb am 2 Jan. 2021
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....

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Debugging and Analysis finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by