求助利用Matlab编程:矩阵中每行各取一个元素,使其和最小,并给出该最短路径的坐标
来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/11 23:38:28
求助利用Matlab编程:矩阵中每行各取一个元素,使其和最小,并给出该最短路径的坐标
分析:矩阵中每行各取一个元素,使其和最小,那么如果每行都取的是该行的最小值的话,那么最后的和肯定也是最小的.
所以只需找到每行的最小值即可.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>> a=magic(10)
a =
92 99 1 8 15 67 74 51 58 40
98 80 7 14 16 73 55 57 64 41
4 81 88 20 22 54 56 63 70 47
85 87 19 21 3 60 62 69 71 28
86 93 25 2 9 61 68 75 52 34
17 24 76 83 90 42 49 26 33 65
23 5 82 89 91 48 30 32 39 66
79 6 13 95 97 29 31 38 45 72
10 12 94 96 78 35 37 44 46 53
11 18 100 77 84 36 43 50 27 59
>> [m,n]=min(a')%%min函数是按列搜索最小值,所以对a进行转置后搜索就是按行搜索
m =
1 7 4 3 2 17 5 6 10 11%%m是每行的最小值
n =
3 3 1 5 4 1 2 2 1 1%%n是最小值对应的列,最小值对应的行其实就是数组n的元素索引值.
即最小值对应的坐标为:(1,n(1)) (2,n(2)) (3,n(3)) (4,n(4)).
再问: 不好意思,我没写清楚,其实还有一个条件,就是相邻两行的元素位置最多只能差1,比如元素a[i][j]的下一个元素只能是a[i+1][j-1]a[i+1][j]a[i+1][j+1]之一。
再答: 思路(仅供参考):相邻两行的元素位置之差最多为1,那么先找到第一行的最小值,假设其坐标为1,j,那么在第二行取a(2,j-1) a(2,j) a(2,j+1)比较它们的大小,取最小值,然后让j等于最小值的j;接着在第三行取a(3,j-1) a(3,j) a(3,j+1),j为第二行最小值的列,再次比较它们的大小,取最小值,最后让j等于最小值的j,依次类推。遇到边界,j-1=0,j+1>10做相应的处理即可。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% a=magic(10); [m1,n1]=min(a(1,:));%%得到第一行的最小值 M=zeros(10,3); M(1,1)=m1;M(1,2)=1;M(1,3)=n1;%%存储最小值和其坐标 j=n1;%%让j=第一行最小值的列 for i=2:10 if j-1==0 b1=a(i,j);b2=a(i,j);b3=a(i,j+1); elseif j+1==10%%对j-1==0和j+1==10做处理 b1=a(i,j-1);b2=a(i,j);b3=a(i,j); else b1=a(i,j-1);b2=a(i,j);b3=a(i,j+1); end b=[b1 b2 b3]; [m,n]=min(b);%%取最小值 M(i,1)=m;M(i,2)=i;%%存储最小值和行号,n是列号,因为不知道哪个值最小,所以要做判断 if n==1&j-1==0 j=j; elseif n==3&j+1==10 j=j; %%%边界处理 elseif n==1&j-1~=0 j=j-1; elseif n==2&j~=0 j=j; elseif n==3&j+1~=10 j=j+1; %%%其余情况处理,更新j end M(i,3)=j; %%存储列号 end M 运行结果: M = 1 1 3 7 2 3 20 3 4 3 4 5 2 5 4 76 6 3 5 7 2 6 8 2 10 9 1 11 10 1%%第一列为最小值,第二列为行号,第三列为列号。
所以只需找到每行的最小值即可.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>> a=magic(10)
a =
92 99 1 8 15 67 74 51 58 40
98 80 7 14 16 73 55 57 64 41
4 81 88 20 22 54 56 63 70 47
85 87 19 21 3 60 62 69 71 28
86 93 25 2 9 61 68 75 52 34
17 24 76 83 90 42 49 26 33 65
23 5 82 89 91 48 30 32 39 66
79 6 13 95 97 29 31 38 45 72
10 12 94 96 78 35 37 44 46 53
11 18 100 77 84 36 43 50 27 59
>> [m,n]=min(a')%%min函数是按列搜索最小值,所以对a进行转置后搜索就是按行搜索
m =
1 7 4 3 2 17 5 6 10 11%%m是每行的最小值
n =
3 3 1 5 4 1 2 2 1 1%%n是最小值对应的列,最小值对应的行其实就是数组n的元素索引值.
即最小值对应的坐标为:(1,n(1)) (2,n(2)) (3,n(3)) (4,n(4)).
再问: 不好意思,我没写清楚,其实还有一个条件,就是相邻两行的元素位置最多只能差1,比如元素a[i][j]的下一个元素只能是a[i+1][j-1]a[i+1][j]a[i+1][j+1]之一。
再答: 思路(仅供参考):相邻两行的元素位置之差最多为1,那么先找到第一行的最小值,假设其坐标为1,j,那么在第二行取a(2,j-1) a(2,j) a(2,j+1)比较它们的大小,取最小值,然后让j等于最小值的j;接着在第三行取a(3,j-1) a(3,j) a(3,j+1),j为第二行最小值的列,再次比较它们的大小,取最小值,最后让j等于最小值的j,依次类推。遇到边界,j-1=0,j+1>10做相应的处理即可。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% a=magic(10); [m1,n1]=min(a(1,:));%%得到第一行的最小值 M=zeros(10,3); M(1,1)=m1;M(1,2)=1;M(1,3)=n1;%%存储最小值和其坐标 j=n1;%%让j=第一行最小值的列 for i=2:10 if j-1==0 b1=a(i,j);b2=a(i,j);b3=a(i,j+1); elseif j+1==10%%对j-1==0和j+1==10做处理 b1=a(i,j-1);b2=a(i,j);b3=a(i,j); else b1=a(i,j-1);b2=a(i,j);b3=a(i,j+1); end b=[b1 b2 b3]; [m,n]=min(b);%%取最小值 M(i,1)=m;M(i,2)=i;%%存储最小值和行号,n是列号,因为不知道哪个值最小,所以要做判断 if n==1&j-1==0 j=j; elseif n==3&j+1==10 j=j; %%%边界处理 elseif n==1&j-1~=0 j=j-1; elseif n==2&j~=0 j=j; elseif n==3&j+1~=10 j=j+1; %%%其余情况处理,更新j end M(i,3)=j; %%存储列号 end M 运行结果: M = 1 1 3 7 2 3 20 3 4 3 4 5 2 5 4 76 6 3 5 7 2 6 8 2 10 9 1 11 10 1%%第一列为最小值,第二列为行号,第三列为列号。
求助利用Matlab编程:矩阵中每行各取一个元素,使其和最小,并给出该最短路径的坐标
在matlab中怎样限定未知数数的取值为0和1,比如在一个4阶方阵中,编程限定其元素为0,1然后再去解这个矩阵
matlab中,建立一个4*4阶的矩阵,编程输出最大元素的行号、列号和元素值.
请问如何在matlab中,删除二维矩阵每行的一个0元素?
在MATLAB中生成一个随机数矩阵,并判断各元素是否大于平均值,由该逻辑值构成新的矩阵.提示:求平均值函
请教matlab中矩阵某元素个数的编程问题
matlab中矩阵计算,如何编程使得某矩阵中的元素均除以该元素行的最大数,得到新的矩阵?
求助 Matlab 用MAGIC命令产生一个5阶矩阵,并求该矩阵每列的最大值、最小值、平均数、和
matlab如果我要取2个数组中元素循环相减后取绝对值最小的个,怎么编程
matlab编程求出一个矩阵所有由该矩阵几列列向量组成的非零子矩阵
已知图的邻接矩阵a,试给出该图的最小生成树.matlab编程
编写程序:输入一个3×3的矩阵,求矩阵中所有元素之和,并找出其中最小的那个元素的行号和列号.