公告:1)网站程序升级:Q2A升级到1.8.6,Wordpress升级到5.7.2
2)修复了头像加载慢与提交问题反应慢等问题
2021-06-16

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

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

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

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

社区建议QQ群:365716997

分类

0 投票
938 浏览
"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.0k 分)
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 分)
...