Replace each element of a matrix with the number it is closest to in a set of discrete values without using for loop

7 次查看(过去 30 天)
I have a set of discrete values in the row vector <list>. I want to take a vector M of real doubles, and for each element M(j) in M I want to replace M(j) with the element in <list> that is closest to M(i) on the number line. For example, if my list was [2 4] and my matrix was [1.1, 3.2, 5, -17], the resulting matrix would be [2, 4, 4, 2].
I know I can do this with a for loop:
for j=1:length(M)
[m mn]=min(abs(list-M(j)));
M(j)=list(mn);
end
Is there any way to do this without a for loop?

采纳的回答

Andrei Bobrov
Andrei Bobrov 2017-8-18
编辑:Andrei Bobrov 2017-8-19
A = [2 4], B = [1.1, 3.2, 5, -17]
[~, ii] = min(abs(bsxfun(@minus,B(:),A(:).')),[],2); % MATLAB <= R2016a
[~, ii] = min(abs(B(:) - A(:).'),[],2); % MATLAB >= R2016b
out = A(ii)
or
F = griddedInterpolant(A,'nearest');
out = F(B)
or
out = interp1(A,B,'nearest','extrap');

更多回答(1 个)

MG Poirot
MG Poirot 2017-8-18
编辑:MG Poirot 2017-8-18
I think I've got a simple solution for you by finding the minimal difference after matrix subtraction:
list = [2 4]';
M = [1.1 3.2 5 -17];
A = repmat(M,numel(list),1)
B = repmat(list,1,numel(M))
dif = abs(A-B)
[~, I] = min(dif,[],1)
list(I)'
-mgp

类别

Help CenterFile Exchange 中查找有关 Loops and Conditional Statements 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by