矩阵对角化例题题!

解一道矩阵题的心路历程--《数学通讯》2011年Z4期
解一道矩阵题的心路历程
【摘要】:正~~
【作者单位】:
【关键词】:
【分类号】:G634.6【正文快照】:
1.问题的由来笔者在教学苏教版4一2《矩阵与变换》中“特征值与特征向量”这节内容时,让学生练习了一道题:尸10,尸l,已知矩阵A一i。2」,“一12」,求出矩阵A笋ka:而导致无法求解.在这里,由于任一非零向量都是矩阵B的特征向量,所以可以取。,一。二尸l,LZ」然后求解.课
欢迎:、、)
支持CAJ、PDF文件格式,仅支持PDF格式
【相似文献】
中国期刊全文数据库
周矛人;[J];潍坊教育学院学报;1990年02期
刘爱兰;;[J];考试周刊;2011年26期
王弟成;;[J];数理化解题研究(高中版);2010年07期
李洪杰,赵文才;[J];临沂师专学报;1994年05期
С.В.福明;蔣巍;;[J];数学通报;1956年10期
蒋茂森;[J];中等数学;1998年03期
邹黎敏;;[J];考试周刊;2009年43期
黎祖杓;;[J];大众商务;2009年22期
霍锦霞;;[J];甘肃高师学报;2006年02期
卓斌;;[J];新高考(语文数学英语);2007年12期
中国硕士学位论文全文数据库
高金泰;[D];西北师范大学;2004年
曹军才;[D];四川师范大学;2007年
郗玲玲;[D];首都师范大学;2006年
李军;[D];西北师范大学;2006年
吴海;[D];华东师范大学;2011年
吴海;[D];华东师范大学;2011年
&快捷付款方式
&订购知网充值卡
400-819-9993
《中国学术期刊(光盘版)》电子杂志社有限公司
同方知网数字出版技术股份有限公司
地址:北京清华大学 84-48信箱 大众知识服务
出版物经营许可证 新出发京批字第直0595号
订购热线:400-819-82499
服务热线:010--
在线咨询:
传真:010-
京公网安备75号第5题:矩阵翻转 - 推酷
第5题:矩阵翻转
第5题:矩阵翻转
晓萌最近在做一个翻转图片的应用,你可能也知道,图片其实是由一个个的点组成的。于是,晓萌想先做一个可以翻转矩阵的程序,来解决他问题的核心部分。
输入第一行包括由空格分开的整数M、N、T(0 & M & 200,0 & N & 200,T=0或1),其中M和N分别表示待处理矩阵的行数与列数,T为0时表示左右翻转,为1时表示上下翻转。
之后的M行,每行包括由空格分隔的N个整数,依次为输入矩阵的每一行的数据。
输出包括M行N列,每个数字之间用一个空格分隔,
每一行行末均有一个空格
,表示的是按照要求翻转后的矩阵。
#include &stdio.h&
int main()
int m,n,t,num[200][200],i,j;
scanf(&%d%d%d&,&m,&n,&t);
for(j = 0;j &j++)
for(i = 0;i &i++)
scanf(&%d&,&num[j][i]);
if(t == 1)
for(j = m-1;j &= 0;j--)
for(i = 0;i &i++)
printf(&%d&,num[j][i]);
if(i != n-1)
printf(& &);
if(j != 0)
printf(&\n&);
for(j = 0;j &j++)
for(i = n-1;i &= 0;i--)
printf(&%d&,num[j][i]);
if(i != 0)
printf(& &);
if(j != m-1)
printf(&\n&);
如果看不懂欢迎留言提问或者留下邮箱!!!o(∩_∩)o&
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致算法题:矩阵链乘问题
算法题:矩阵链乘问题
矩阵链乘问题是最典型的动态规划问题,要理解下面的内容请先阅读这篇动态规划的总结。
1.问题描述
矩阵链乘问题的描述如下,就是说要确定一个完全加括号的形式使得矩阵链乘需要进行的标量计算数目最少,矩阵Ai的维数为pi-1×pi,如果穷举所有可能形式的话,时间复杂度是指数级的!因为该问题满足最优子结构,并且子问题存在重叠,所以我们可以借助动态规划来求解。
2.问题分析
我们需要确定一个递归式来将我们要求解的问题表示出来,下面摘自导论,介绍地非常详细
最后给出的递归式如下,就是说我们要如何确定从第i个矩阵到第j个矩阵组成的矩阵链的最优解。如果i和j相等,那么就是一个矩阵,不需要运算;如果i小于j,那么肯定要从它们中间的某个位置分开来,那从哪里分开来呢? 这个我们可以尝试下所有可能的选择,也就是尝试不同的位置k,k满足条件(i <=k < j),在位置k将矩阵链进行分开,看看它需要的计算次数,然后我们从这些可能的k中选择使得计算次数最小的那个k进行分开,分开了之后我们的问题就变成了2个小问题,确定矩阵链从i到k 和另一个矩阵链从k+1到j的最优解。如果我们一开始设置i=1(第一个矩阵),j=n(最后一个矩阵),那么,经过上面的递归即可得到我们需要的解。这就是递归的思想!
3.代码实现
根据上面的思想我们很快就可以写出一个递归版本的矩阵链承法的实现代码,输出的结果也没有错,给出的加括号的方式是( ( A1 ( A2 A3 ) ) ( ( A4 A5 ) A6 ) )。[问题的数据是导论中的问题的数据,值是30,35,15,5,10,20,25]。
def matrixchain_rec(p,i,j):
k in range(i,j):
q=matrixchain_rec(p,i,k)+matrixchain_rec(p,k+1,j)+p[i-1]*p[k]*p[j]
if q<m[i][j]:
return m[i][j]
def showmatrixchain(s,i,j):
print A%d%(i),
print (,
showmatrixchain(s,i,s[i][j])
showmatrixchain(s,s[i][j]+1,j)
print ),
p=[30,35,15,5,10,20,25]
m=[[sys.maxint for i in range(n+1)] for j in range(n+1)]
s=[[0 for i in range(n+1)] for j in range(n+1)]
# pprint.pprint(m)
result=matrixchain_rec(p,1,6)
print(result) #15125
showmatrixchain(s,1,6) #( ( A1 ( A2 A3 ) ) ( ( A4 A5 ) A6 ) )
上面的代码运行没有问题,但是,它不够完美!为什么呢? 很明显,矩阵链乘问题子问题存在重叠,下面这张图很形象地显示了哪些子问题被重复计算了,所以我们需要改进,改进的方法就是使用带备忘录的递归形式!
要改成带备忘录的很简单,但是,这次我们不能直接使用原来的装饰器,因为Python中的dict不能对list对象进行hash,所以我们要简单地修改下我们key值的构建,也很简单,看下代码就明白了:
from ctools import wraps
def memo(c):
def wrap(*args):
#build new key!!!
key=str(args[1])+str(args[2])
if key not in cache:
cache[key]=c(*args)
return cache[key]
return wrap
def matrixchain_rec(p,i,j):
k in range(i,j):
q=matrixchain_rec(p,i,k)+matrixchain_rec(p,k+1,j)+p[i-1]*p[k]*p[j]
if q<m[i][j]:
return m[i][j]
def showmatrixchain(s,i,j):
print A%d%(i),
print (,
showmatrixchain(s,i,s[i][j])
showmatrixchain(s,s[i][j]+1,j)
print ),
p=[30,35,15,5,10,20,25]
m=[[sys.maxint for i in range(n+1)] for j in range(n+1)]
s=[[0 for i in range(n+1)] for j in range(n+1)]
# pprint.pprint(m)
result=matrixchain_rec(p,1,6)
print(result) #15125
showmatrixchain(s,1,6) #( ( A1 ( A2 A3 ) ) ( ( A4 A5 ) A6 ) )
接下来的一个问题是,我们怎么实现迭代版本呢? 迭代版本关键在于顺序!我们怎么保证我们在计算$A{i…j}的最优解时,所有可能的k的选择需要求解的子问题A{i…k}以及A_{(k+1)…j}$是已经求解出来了的呢? 一个简单但是有效的想法就是看矩阵链的长度,我们先计算矩阵链短的最优解,然后再计算矩阵链长的最优解,后者计算时所需要求解的子问题肯定已经求解完了,对不对? 于是就有了迭代版本的实现,需要注意的就是其中的i,j,k的取值范围。
import sys
def matrixchain_iter(p):
n=len(p)-1 #total n matri 6
problem below, so initialize to n+1!!!
i in range(n+1)]
j in range(n+1)]
i in range(n+1)]
j in range(n+1)]
i in range(n): # matrix with len=1
# m[i][i]=0
# pprint.pprint(m)
l in range(2,n+1): #iterate
length, max is n
i in range(1,n-l+2): #i max is n-l+1
j=i+l-1 #j is always l away from i
m[i][j]=sys.maxint #initial to infinity
k in range(i,j):
#attention to
array when index < 0!!!
#solution is using more space with useless values
q=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]
if q<m[i][j]:
# print(when len is %d  % (l))
# pprint.pprint(m)
return m,s
m,s=matrixchain_iter(p)
print(m[1][6]) #15125
showmatrixchain(s,1,6) #( ( A1 ( A2 A3 ) ) ( ( A4 A5 ) A6 ) )
实现的时候需要注意一点,在Python中取list中的值时,如果索引是负值的话会从后面往前数返回对应的元素,而以前我们用语言的时候肯定是提示越界了,所以代码中用来存储结果的数数组是(n+1)x(n+1),而不是nxn的,这样的话就能够保证返回的是0,而不是从后往前数得到的结果。
得到的数组m如下,m[1,6]就是我们需要的解。
[[0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, , 15125],
[0, 0, 0, , ],
[0, 0, 0, 0, 750, ],
[0, 0, 0, 0, 0, ],
[0, 0, 0, 0, 0, 0, 5000],
[0, 0, 0, 0, 0, 0, 0]]
数组s如下:
[[0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 3, 3, 3],
[0, 0, 0, 2, 3, 3, 3],
[0, 0, 0, 0, 3, 3, 3],
[0, 0, 0, 0, 0, 4, 5],
[0, 0, 0, 0, 0, 0, 5],
[0, 0, 0, 0, 0, 0, 0]]
将这个两个数组旋转下,并且只看上三角部分的数字,就可以得到导论中给出的那张三角图形了,非常类似杨辉三角
(有话说)我的个性宣言
  一个小兵喝得酩酊大醉地回营。&你何必醉成这模样,&长官告诫他道,&你如果不喝酒,可能已经升到上等兵,说不定已经当军官了。&  &报告上尉,&小兵回答,&我只要一杯酒下肚,就觉得自己是上校了!&
您好,请登录后进行评论。点击
在这里输入评论
五色云平台
关于五色云&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&
Powered by 阳光大学生网 (C)
沪ICP备号-1
Copyright@ 阳光大学生网 公司介绍 联系我们 合作投稿等联系方式 邮箱

我要回帖

更多关于 矩阵的奇异值分解例题 的文章

 

随机推荐