所以我找不到解决以下问题的简单方法: 我有两个行数相同的矩阵:
A = [547 184 929 306;
296 368 776 509;
745 626 487 511;
189 780 436 818;
687 81 447 795]
B = [644 939 208 195 311 980;
379 876 301 226 923 439;
812 550 471 171 430 111;
533 622 230 228 185 258;
351 587 844 436 905 409]
如何创建矩阵C(大小(C)=大小(B)),其中矩阵B的每个元素从对应的行中找到矩阵A的最接近元素。 在目前的情况下:
C =
547 929 184 184 306 929
368 776 296 296 776 509
745 511 487 487 487 487
436 780 189 189 189 189
447 687 795 447 795 447
目前我只想到了这个:
temp = bsxfun(@eq,abs(bsxfun(@minus,repmat(A,1,1,size(B,2)),permute(B,[1,3,2]))),min(abs(bsxfun(@minus,repmat(A,1,1,size(B,2)),permute(B,[1,3,2]))),[],2));
C = permute(sum(temp.*repmat(A,1,1,size(B,2)),2),[1,3,2]);
那么解决这个任务有什么简单易懂的方法吗?
答案 0 :(得分:1)
使用bsxfun
的第二个输出可以将三个min
简化为一个,它给出了最小值的位置(我的代码的第一行)。然后将这些位置转换为线性索引,应用于A
(第二行):
[~, jj] = min(abs(bsxfun(@minus, permute(A, [1 3 2]), B)), [], 3);
C = A(sub2ind(size(B), ndgrid(1:size(B,1),1:size(B,2)), jj));
答案 1 :(得分:1)
您也可以使用最近邻插值来完成:
for row = 1:size(A,1)
I = interp1(A(row,:), 1:size(A,2), B(row,:), 'nearest','extrap');
C(row,:)=A(row,I);
end