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)小问该怎么写代码呀![[泪]](/static/emoticons/u6cea.png)
![[泪]](/static/emoticons/u6cea.png)
![[泪]](/static/emoticons/u6cea.png)
我的代码是
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
简单来说就是,一个矩阵,里面矩阵元的值都为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


