求助,如何定位一个矩阵元后改变该矩阵元周围矩阵元的值
mathematica吧
全部回复
仅看楼主
level 1
艺冷天J 楼主
如图,具体的问题就是(c)小问,(b)和第一张图是背景介绍
简单来说就是,一个矩阵,里面矩阵元的值都为0.1.2三个数中的一个,我们想对这个矩阵进行一个操作,使得输入一个矩阵后,这个矩阵里为2的矩阵元都替换为0,如果这个为2的矩阵元周围的四个矩阵元中有为1的,就将1变成2,如果为0就不变,通过这些改变后输出一个新矩阵
如果这个为2的矩阵元在矩阵的边缘,比如说a11,那它的4个周围矩阵元是am1,a1n,a21,a12(这个矩阵是mxn的)
我自己写的思路是先用position定位矩阵中2所在的位置,然后用take得到这个位置的i,j,由此得到这个矩阵元周围的4个矩阵元的值,用which去判断这4个值有没有等于1的,有的话就将该值用ReplacePart换成2
写完后有几个问题,
1.如果单独用这个代码,能输出正确答案,但是把这个代码放进自定义函数里,会因为有mat=ReplacePart[mat,{x,x}->x]这一步出现cannot assign to raw object的错误
2.这个代码仅适用于矩阵里所有元素只有一个元素为2的情况,如果矩阵里有好几个2就不行了
3.感觉写得特别复杂...觉得应该有简洁的写法
求大佬帮忙看看,(c)小问该怎么写代码呀[泪][泪][泪]
我的代码是
mat0 = {{1, 1, 0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 1, 0, 1, 1, 1, 0, 1,
0}, {1, 0, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 1, 0,
1}, {0, 0, 0, 1, 2, 0, 0, 0, 1, 0}, {1, 0, 0, 0, 1, 0, 0, 0, 0,
1}, {0, 0, 1, 0, 0, 0, 1, 1, 1, 1}, {1, 0, 0, 1, 1, 0, 0, 0, 1,
0}, {1, 0, 0, 0, 0, 0, 0, 1, 0, 0}, {1, 1, 0, 0, 0, 0, 1, 1, 1, 1}}
i = Take[Flatten[Position[mat0, 2]], 1][[1]];
j = Take[Flatten[Position[mat0, 2]], 2][[1]];
mat0 = ReplacePart[mat0, Position[mat0, 2] -> 0];
Which[i != 1 &&
j != 1, {m1 = Flatten[Take[mat0, {i - 1, i - 1}, {j, j}]][[1]];
m2 = Flatten[Take[mat0, {i, i}, {j - 1, j - 1}]][[1]];
m3 = Flatten[Take[mat0, {i + 1, i + 1}, {j, j}]][[1]];
m4 = Flatten[Take[mat0, {i, i}, {j + 1, j + 1}]][[1]];
Which[m1 == 1, mat0 = ReplacePart[mat0, {i - 1, j} -> 2]];
Which[m2 == 1, mat0 = ReplacePart[mat0, {i, j - 1} -> 2]];
Which[m3 == 1, mat0 = ReplacePart[mat0, {i + 1, j} -> 2]];
Which[m4 == 1, mat0 = ReplacePart[mat0, {i, j + 1} -> 2]]},
i == 1 && j != 1, {m1 = Flatten[Take[mat0, {-1, -1}, {j, j}]][[1]];
m2 = Flatten[Take[mat0, {i, i}, {j - 1, j - 1}]][[1]];
m3 = Flatten[Take[mat0, {i + 1, i + 1}, {j, j}]][[1]];
m4 = Flatten[Take[mat0, {i, i}, {j + 1, j + 1}]][[1]];
Which[m1 == 1, mat0 = ReplacePart[mat0, {-1, j} -> 2]];
Which[m2 == 1, mat0 = ReplacePart[mat0, {i, j - 1} -> 2]];
Which[m3 == 1, mat0 = ReplacePart[mat0, {i + 1, j} -> 2]];
Which[m4 == 1, mat0 = ReplacePart[mat0, {i, j + 1} -> 2]]},
i != 1 &&
j == 1, {m1 = Flatten[Take[mat0, {i - 1, i - 1}, {j, j}]][[1]];
m2 = Flatten[Take[mat0, {i, i}, {-1, -1}]][[1]];
m3 = Flatten[Take[mat0, {i + 1, i + 1}, {j, j}]][[1]];
m4 = Flatten[Take[mat0, {i, i}, {j + 1, j + 1}]][[1]];
Which[m1 == 1, mat0 = ReplacePart[mat0, {i - 1, j} -> 2]];
Which[m2 == 1, mat0 = ReplacePart[mat0, {i, -1} -> 2]];
Which[m3 == 1, mat0 = ReplacePart[mat0, {i + 1, j} -> 2]];
Which[m4 == 1, mat0 = ReplacePart[mat0, {i, j + 1} -> 2]]},
i == 1 && j == 1, {m1 = Flatten[Take[mat0, {-1, -1}, {j, j}]][[1]];
m2 = Flatten[Take[mat0, {i, i}, {-1, -1}]][[1]];
m3 = Flatten[Take[mat0, {i + 1, i + 1}, {j, j}]][[1]];
m4 = Flatten[Take[mat0, {i, i}, {j + 1, j + 1}]][[1]];
Which[m1 == 1, mat0 = ReplacePart[mat0, {-1, j} -> 2]];
Which[m2 == 1, mat0 = ReplacePart[mat0, {i, -1} -> 2]];
Which[m3 == 1, mat0 = ReplacePart[mat0, {i + 1, j} -> 2]];
Which[m4 == 1, mat0 = ReplacePart[mat0, {i, j + 1} -> 2]]}];
mat0
2021年02月06日 05点02分 1
level 1
艺冷天J 楼主
2021年02月06日 06点02分 2
吧务
level 15
2021年02月06日 07点02分 3
不是...可能是同学[小乖]因为是老师最近给的任务[小乖]我先看看!谢谢大佬!
2021年02月06日 07点02分
level 9
晚上帮你看看。你的翻译准确吗?我英语都是谷歌翻译教的[滑稽]
2021年02月06日 08点02分 4
应该没问题[哈哈]谢谢大佬!
2021年02月06日 09点02分
建议先看看SE那帖。在我看来这问题在那边基本解决了。
2021年02月06日 09点02分
@xzcyr 那边给出的方案只把2周围的1变成了2,没有把之前就存在的2变成0,加上我没有太看明白那边的方法,所以也没想出来怎么修改那边给出的代码,如果能有其他的办法就最好了[乖]
2021年02月06日 11点02分
level 9
我看了一下,元胞自动机完美符合你的要求。就是写起来比较麻烦,帮助文档看的我打脑壳。
建议你仔细看一下元胞自动机的帮助文档,知道规则怎么写了你就会了。
2021年02月06日 13点02分 5
好的,谢谢[哈哈]
2021年02月06日 14点02分
level 1
艺冷天J 楼主
解决了[OK]感谢大佬们
2021年02月06日 14点02分 6
1