【问题标题】:create matrix in which for every element of matrix B found closest element of matrix A创建矩阵,其中为矩阵 B 的每个元素找到矩阵 A 的最近元素
【发布时间】:2014-05-15 11:02:58
【问题描述】:

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

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 (size(C)=size(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]);

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

【问题讨论】:

  • 你得到的解决方案除了可读性还有其他问题吗?
  • 我认为你的实现只是你想要的,如果你有可读性问题,你可以通过定义帮助变量来拆分函数。否则,如果您对解决方案真的不满意,请检查:mathworks documentation: dsearchn。这是指向dsearchn() 的链接,可以解决问题。但我认为 ti 搜索整个矩阵 A 而不仅仅是一行
  • 不,一切正常,只有大量相同的功能困扰着我。即使是计算时间也很好。
  • 请注意,您的bsxfuns 中的repmats 可以被删除。事实上,bsxfun 的真正目的是避免使用repmat

标签: matlab matrix


【解决方案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));

【讨论】:

    【解决方案2】:

    您也可以使用最近邻插值:

    for row = 1:size(A,1)
      I = interp1(A(row,:), 1:size(A,2), B(row,:), 'nearest','extrap');
      C(row,:)=A(row,I);
    end 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多