公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

0 投票
2.5k 浏览
"08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48"

如上图,mathematica中可以用ImportString[%, "Table"]导入上面的矩阵,现在已经知道了{87, 97, 94, 89}是某个对角线上连续的4个元素,如何方便地找出它们的位置{{13, 7}, {14, 6}, {15, 5}, {16, 4}},并高亮显示?发现用Position好像不好使
用户: 孺子剑牛不群 (216 分)

3 个回答

+3 投票

貌似没有现成的函数,下面是一个笨办法,只适用于搜索结果唯一的情况:

m = ImportString[
   "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
   49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
   81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
   52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
   22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
   24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
   32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
   67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
   24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
   21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
   78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
   16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
   86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
   19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
   04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
   88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
   04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
   20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
   20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
   01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48"
   , "Table"];
direction = {1, -1};(*负对角线搜索,如果搜索主对角线,使用{1,1}*)
p = Position[m, #] & /@ {87, 97, 94, 89};(*找出每个数字出现的所有位置*)
pp = Flatten[Table[
   temp = 
    Position[Outer[#1 - #2 &, p[[k]], p[[k + 1]], 1], 
     direction](*筛选出相邻数字在对角线上的位置*)
   , {k, Length[p] - 1}]];
pp = {pp[[1]]}~Join~pp[[2 ;; -1 ;; 2]];(*整理*)
ppp = Inner[Part, p, pp, List](*位置*)
ptable = MapIndexed[
   If[FreeQ[ppp, #2], Style[#1, Gray], Style[#1, Bold]] &, 
   m, {2}];(*格式化矩阵*)
Grid[ptable, Alignment -> Center, Frame -> True, 
 Background -> LightBlue](*输出矩阵*)

 

用户: 野鹤 (5.1k 分)
HitMissTransform,专为这题而生
搞图像处理,厉害了,这种函数都知道。
但是怎么用呢?
稍等一阵,我感觉图论+图片处理至少有3种可写,记得提醒我 :)
哪3种...
+2 投票
find[mat_, list_] := Module[{n, len, pattern, matR},
n = Length@mat;
len = Length@list;
pattern = list | Reverse[list];
matR = Reverse /@ mat;
Catch[
Do[If[# != {}, Throw[{#, # + i} & /@ Range @@ #[[1]]]] &@
SequencePosition[Diagonal[mat, i], pattern, 1], {i, -n + len, 
n - len}];
Do[If[# != {}, Throw[{#, n + 1 - i - #} & /@ Range @@ #[[1]]]] &@
SequencePosition[Diagonal[matR, i], pattern, 1], {i, -n + len, 
n - len}]
]
];
MapAt[Style[#, Bold, Red] &, mat, find[mat, {87, 97, 94, 89}]] // Grid

 

用户: 无影东瓜 (1.2k 分)
修改于 用户:无影东瓜
+1 投票

直接编号暴力找

list = {87, 97, 94, 89};
Take[#, First@SequencePosition[#[[;; , 1]], list | Reverse@list]] &@
 Catenate[Table[
   Diagonal[
    Reverse /@ 
     MapThread[
      Transpose[{##}] &, {mat, 
       Array[{##} &, Dimensions@mat]}], -k], {k, -(l = 
       Length[mat] - 1), l}]]

 

用户: jiaoeyushushu (161 分)
...