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

9 ビュー (過去 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 Center および File ExchangeCharacters and Strings についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by