MATLAB中文论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1661|回复: 14|关注: 0

[已解决] 有一个子矩阵是另一个矩阵中的一块如何找到并返回它的...

[复制链接]

新手

7 麦片

财富积分


050


1

主题

5

帖子

0

最佳答案
如题,现有有一个矩阵A是矩阵B中的一块,我想通过A找到它在矩阵B中的位置,并返回位置信息

论坛优秀回答者

权威

6259 麦片

财富积分



5

主题

7554

帖子

1435

最佳答案
  • 关注者: 317
发表于 2017-6-6 10:45:07 | 显示全部楼层
本帖最后由 jingzhaos 于 2017-6-6 10:49 编辑

是这样吗?
  1. B=rand(6,7)
  2. A=B(2:4,3:6)
  3. [lia,loc]=ismember(A,B)
复制代码


还是要:
  1. if all(lia(:))
  2.      [I J]=ind2sub(size(B),loc(1,1))
  3. end
复制代码

MATLAB 基础讨论
版块优秀回答者

入门

230 麦片

财富积分


50500


5

主题

268

帖子

51

最佳答案
  • 关注者: 6
发表于 2017-6-6 10:52:47 | 显示全部楼层 |此回复为最佳答案
jingzhaos 发表于 2017-6-6 10:45
是这样吗?

还是要:

你这样只能保证A的每个元素都出现在B中,不能保证A是作为整体出现的。我看还是得循环:
  1. B = magic(10);
  2. A = B(3:4, 4:7); % 测试数据

  3. szA = size(A);
  4. szB = size(B);
  5. k = 0;
  6. loc = [];
  7. for i = 1:szB(1)-szA(1)+1
  8.     for j = 1:szB(2)-szA(2)+1
  9.         if isequal(A, B(i:i+szA(1)-1, j:j+szA(2)-1))
  10.             k = k+1;
  11.             loc(k,1:2) = [i j]; % loc的每行是A左上角元素在B中的位置
  12.         end
  13.     end
  14. end
复制代码

论坛优秀回答者

权威

6259 麦片

财富积分



5

主题

7554

帖子

1435

最佳答案
  • 关注者: 317
发表于 2017-6-6 10:54:52 | 显示全部楼层
本帖最后由 jingzhaos 于 2017-6-6 11:00 编辑
caderousse 发表于 2017-6-6 10:52
你这样只能保证A的每个元素都出现在B中,不能保证A是作为整体出现的。我看还是得循环:
...

你说的对

MATLAB 基础讨论
版块优秀回答者

入门

230 麦片

财富积分


50500


5

主题

268

帖子

51

最佳答案
  • 关注者: 6
发表于 2017-6-6 10:57:48 | 显示全部楼层
  1. >> B=magic(3)

  2. B =

  3.      8     1     6
  4.      3     5     7
  5.      4     9     2

  6. >> A=[8 6;3,2]

  7. A =

  8.      8     6
  9.      3     2

  10. >> [lia,loc]=ismember(A,B)

  11. lia =

  12.   2×2 logical 数组

  13.    1   1
  14.    1   1


  15. loc =

  16.      1     7
  17.      2     9

  18. >> all(lia(:))

  19. ans =

  20.   logical

  21.    1

  22. >>
复制代码

新手

7 麦片

财富积分


050


1

主题

5

帖子

0

最佳答案
 楼主| 发表于 2017-6-6 14:24:46 | 显示全部楼层
jingzhaos 发表于 2017-6-6 10:45
是这样吗?

还是要:

貌似不行~

新手

7 麦片

财富积分


050


1

主题

5

帖子

0

最佳答案
 楼主| 发表于 2017-6-6 14:25:57 | 显示全部楼层
caderousse 发表于 2017-6-6 10:52
你这样只能保证A的每个元素都出现在B中,不能保证A是作为整体出现的。我看还是得循环:
...

厉害,多谢大神指点,

论坛优秀回答者

权威

3520 麦片

财富积分



19

主题

3749

帖子

758

最佳答案
  • 关注者: 317
发表于 2017-6-6 15:05:42 | 显示全部楼层
本帖最后由 wuyou136 于 2017-6-6 15:30 编辑

[rol, col] = find(filter2(A, B, 'valid') == sum(A(:).^2))

为避免浮点误差:
[rol, col] = find(abs(filter2(A, B, 'valid')-sum(A(:).^2))<eps*1e5)



新手

7 麦片

财富积分


050


1

主题

5

帖子

0

最佳答案
 楼主| 发表于 2017-6-6 15:34:15 | 显示全部楼层
wuyou136 发表于 2017-6-6 15:05
[rol, col] = find(filter2(A, B, 'valid') == sum(A(.^2))

为避免浮点误差:

滤波的思想,平方相等,这个更简洁了

新手

7 麦片

财富积分


050


1

主题

5

帖子

0

最佳答案
 楼主| 发表于 2017-6-6 16:57:21 | 显示全部楼层
wuyou136 发表于 2017-6-6 15:05
[rol, col] = find(filter2(A, B, 'valid') == sum(A(.^2))

为避免浮点误差:

:loveliness:多谢指点!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

快速回复 返回顶部 返回列表