matlab - 创建矩阵,其中对于矩阵 B 的每个元素都找到矩阵 A 的最接近元素

标签 matlab matrix

所以我找不到解决以下问题的简单方法: 我有两个行数相同的矩阵:

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]);

那么有没有简单易懂的方法来解决这个任务呢?

最佳答案

使用 min 的第二个输出可以将三个 bsxfun 减少为一个,它给出了最小值的位置(我的代码的第一行)。然后,这些位置将转换为线性索引,应用于 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));

关于matlab - 创建矩阵,其中对于矩阵 B 的每个元素都找到矩阵 A 的最接近元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23676384/

相关文章:

r - 从矩阵中提取一行

python-3.x - Numpy:递归生成矩阵

matlab - 在 Matlab 中调整误差条宽度

algorithm - QuickSort 程序达到最大递归限制 500?

performance - Matlab矩阵乘法速度

algorithm - 想在对排序矩阵使用二进制搜索逻辑时了解时间复杂度

matlab - 在 Matlab 中将列插入矩阵

matlab - 通过在 MATLAB 中填充当前值来扩展数组

算法复杂度: Strassen's algorithm is polynomially faster than n-cubed regular matrix multiplication. "polynomially faster"是什么意思?

performance - 在 Matlab 中查找没有 NaN 的行的最快方法