【发布时间】: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。