此处矩阵Pa的转置矩阵的行列式行列式有无问题?

PT+E=(P+E)T
为什么等式成立
T是转置的意思_百度知道
PT+E=(P+E)T
为什么等式成立
T是转置的意思
PT+E=(P+E)T
为什么等式成立
T是转置的意思
我有更好的答案
(A^T)^T = A2、(A+B)^T = A^T + B^T3转置满足、(AB)^T = B^T*A^T题目解答:因为 E 是对称矩阵:1
中学高级教师
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。为什么转置512x512矩阵,会比513x513矩阵慢很多? - 文章 - 伯乐在线
& 为什么转置512x512矩阵,会比513x513矩阵慢很多?
谨以此文,纪念刚退休的Professor Sibert以及Professor Goel。你们尽管已年过70,却还仍然坚持在教导学生,实在令人钦佩。我今天所拥有的编程知识,经验,技巧,很大一部分是从你们那儿学来的。谢谢你们。
问题的出处:
事情的起因是这样的,先看下面这段代码:
define SAMPLES 1000
#define MATSIZE 512
#include &time.h&
#include &iostream&
int mat[MATSIZE][MATSIZE];
void transpose()
for ( int i = 0 ; i & MATSIZE ; i++ )
for ( int j = 0 ; j & MATSIZE ; j++ )
int aux = mat[i][j];
mat[i][j] = mat[j][i];
mat[j][i] =
int main()
//initialize matrix
for ( int i = 0 ; i & MATSIZE ; i++ )
for ( int j = 0 ; j & MATSIZE ; j++ )
mat[i][j] = i+j;
int t = clock();
for ( int i = 0 ; i & SAMPLES ; i++ )
transpose();
int elapsed = clock() -
std::cout && "Average for a matrix of " && MATSIZE && ": " && elapsed / SAMPLES;
12345678910111213141516171819202122232425262728293031
define SAMPLES 1000#define MATSIZE 512&#include &time.h&#include &iostream&int mat[MATSIZE][MATSIZE];&void transpose(){&& for ( int i = 0 ; i & MATSIZE ; i++ )&& for ( int j = 0 ; j & MATSIZE ; j++ )&& {&&&&&& int aux = mat[i][j];&&&&&& mat[i][j] = mat[j][i];&&&&&& mat[j][i] = aux;&& }}&int main(){&& //initialize matrix&& for ( int i = 0 ; i & MATSIZE ; i++ )&& for ( int j = 0 ; j & MATSIZE ; j++ )&&&&&& mat[i][j] = i+j;&&& int t = clock();&& for ( int i = 0 ; i & SAMPLES ; i++ )&&&&&& transpose();&& int elapsed = clock() - t;&&& std::cout && "Average for a matrix of " && MATSIZE && ": " && elapsed / SAMPLES;
很普通的一个求矩阵转置的程序。但是,当MATSIZE取512和513的时候,出现了非常有意思的结果:
512 平均 2.19ms
513 平均 0.57ms
很让人惊讶吧,513竟然比512快。更进一步的研究发现,size=512的时候,运算速度会比同数量级的其它数字慢很多很多。这是怎么一回事呢?
stackoverflow上大牛给的解答非常正确,但是这次,我不想做翻译了。我从Professor Sibert那里,从Professor Goel那里,学到的知识,足够帮我解决这个问题了,我不是一个人。下面是我的解答:
很容易就联想到,造成这个问题的原因是CPU cache,我们有很多种方式来存储cache,具体可以参考。
原作者没有给出他的CPU型号,但是如今的pc几乎都是采用的set associative的cache结构,下面我用2-way set associate来做例子,讲解一下cache的工作原理。
(图片取自Professor Sibert的讲义,这可是纯ascii画的哦= =)
一个内存地址,可以划分为block,tag,word,byte 4个部分。10bits的block,对应了1024个cache set,内存地址的block固定了,就必须存储在相应的set里面,这样可以把查询cache的事件从O(n)缩短为O(1)。
举个例子,block是1111),你的数据就放在第1023个set里面。可能有人会觉得奇怪,为什么block不是取的最前面的10bits,这当然是有道理的,通常在内存里数据都是连续存放的,就是说,同一段程序用的数据,他们前10位几乎都是一样的,如果用前10位来定位block,那么collision的发生率非常高,cache效率非常低下,所以才选了后面的10位来定位block。
当然,每个set里面有多条记录,2-way是2条,你得遍历这两条记录,比较前面50位的tag,如果tag一样,并且Valid bit(V)=1,那么恭喜你,你的数据在cache里面,接着就可以通过word和byte来取数据了。
如果遍历完这两条记录,还是没有找到tag的话,那么很遗憾,你的数据不在cache里,得从内存里读。从内存里获取相应的数据,然后把它存到对应的cache set里,如果set里有空位的话最好,如果没有的话,用来替换。因为一个set里只有2条数据,所以实现LRU仅仅需要一个额外bit就可以了,非常高效。
好了,背景知识介绍的差不多了,让我们回到这个问题上来。为什么512大小的矩阵,会比其它数字慢那么多?
让我们来计算一下,512×512的int矩阵,在内存里是连续存放的。每个cache line是16bytes,对应4个int,所以一个n阶矩阵的row可以填充n/4个cache set。假设第一个数据a[0][0]正好对应cache set 0,那么其中每一个数据a[i][j]对应的cache set是(512i+j)/4%i+j/4)%1024。可以看到,前面的系数正好可以整除。很不巧的是,在进行矩阵转置的运算时,在第2个for循环中,我们需要依次访问每一个row中对应i的值。这样会造成下面的结果:假设i=0,set(a[0][0])=0, set(a[1][0])=128, set(a[2][0])=256…set(a[7][0])=896,set(a[0][0])=0,后面开始重复了,到a[15][0]的时候刚好填完整个cache的所有128整数倍的set,当读取a[16][0]的时候,将会发生replace,把a[0][0]从cache里移除。这样,当源程序的i=1时,将完全重复i=0的计算过程,每次取数据都需要先从memory读到cache中来,cache的作用完全没有体现。
而当size=513的时候,事情就不一样了,mat[i][j]对应的cache set是(513i+j)/4%1024,前面的系数除不尽了,每递增4次结果会比size=512时偏差1。例如:set(a[0][0])=0, set(a[1][0])=128, set(a[2][0])=256,set(a[3][0])=384, set(a[4][0])=513…这样就很微妙的把cache set给错开了。a[16][0]不在第0行而是第4行,不会覆盖之前的数据。即使将全部的a[0-15][i]都读入cache,也不会发生碰撞。之后,由于一个cache有4个word,a[0-15][i+1],a[0-15][i+2],a[0-15][i+3]也同时被读进cache里了,所以计算i+1,i+2,i+3时,仅仅需要读对应行的数据就可以了,同一行的数据都是连续的,所以碰撞率很低。这个计算过程很好的利用了cache,如果不考虑其他因素(实际上,这个已经是影响运行时间的最大因素了),理论上我们可以节省75%的运行时间,可以看到,这个理论预测是和提问者给的数据相符合的。
总之,当你的data size是128的整数倍的时候,得特别小心,搞不好cache collision就把你的程序给拖慢了呢
Update 1: 原代码有逻辑错误,这点大家都不要吐槽了,代码不是我写的= =
Update 2:帅哥问我,为什么可以加速这么多。这个循环包括4次读cache的操作,2次写cache的操作,以及0-2次replace操作。每次replace操作会有一次memory read,有可能会有memory write(假设它是write back)。前面的读写cache时间和读写内存相比,几乎可以忽略,对效率产生显著影响的是后面的内存读写。如果cache的hit率高了,那么内存读写的次数就少了,程序运行时间是会产生很大影响的
Update 3:当然,具体效果还视乎CPU架构而定,我自己试验的只有节省25%左右时间
Update 4: 有人提出了用划分矩阵(把大矩阵分成若干个小矩阵分别计算)的方法来求转置。划分矩阵可以解决类似的问题(譬如说求两个矩阵乘积),但是对解决这个问题没有任何帮助。因为求转置的时候,每个数据只用到了一次,没有重复访问;即便划分成更小的矩阵,在cache里面的位置也没有发生改变。
Update 5: 据说,Professor Goel只是因病休息几个学期,没有退休。。。(原来你还要回来教课!!!)
可能感兴趣的话题
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2018 伯乐在线暂无话题描述关注话题分享阅读全文1.3K165 条评论分享收藏感谢阅读全文1.2K102 条评论分享收藏感谢阅读全文1.2K72 条评论分享收藏感谢阅读全文1.1K83 条评论分享收藏感谢阅读全文95864 条评论分享收藏感谢4,209高等代数矩阵证明题A为nxn矩阵,rankA=r,证:存在一个nxn可逆矩阵P使PAP∧(-1)的后n-r行全为0(只用
高等代数矩阵证明题A为nxn矩阵,rankA=r,证:存在一个nxn可逆矩阵P使PAP∧(-1)的后n-r行全为0(只用行列式、线性相关性、矩阵运算的知识,后面还没学到)感觉给右乘P∧-1没什么用啊,只要求后n-r行,右乘不是影响列吗
在这个问题里P^{-1}确实没什么用,你只要把PA化到后n-r行为0的形式就够了等你学到特征值和相似变换之后就会明白这里列变换的作用
我有更好的回答:
剩余:2000字
与《高等代数矩阵证明题A为nxn矩阵,rankA=r,证:存在一个nxn可逆矩阵P使PAP∧(-1)的后n-r行全为0(只用》相关的作业问题
m*n矩阵A的秩为 r( r>=1 ) 存在可逆矩阵P,Q使得PAQ=diag(1,1,...1,0...)(共r个1,这就是A的标准型) A=P^(-1)diag(1,1,...1,0...)Q^(-1) =P^(-1)diag(1,0,0...0,0...0)Q^(-1)+P^(-1)diag(0,1,0,...0
这个要用一点图论的技术考虑一个n个节点的图,如果A(i,j)≠0就在i->j连一条边(允许i=j的情况)由条件可得对于每个点i而言,恰好有一条边从i出发,也恰好有一条边以i为终点这个图 有n条边,可以分成若干个互不相交的环,根据连通分支把这些点重新编号一下(把同一个环上的点依次排在一起),从矩阵上看就是根据图取一个排列
利用“实对称矩阵A是正定阵的充要条件是A的所有特征值大于0”即可完成所有证明.因A是实对称阵,所以A的所有特征值是实数,可设A的最小特征值是a,最大特征值是b.问题1中,取t>-a即可.问题2中,若A特征值全大于或等于0,则t可取任意正数;若A特征值全小于0,则t可取任意负数;若A特征值有正有负,则取-1/
首先注意到A(A^{-1}+B^{-1})B=B+A,于是A^{-1}+B^{-1}=A^{-1}(A+B)B^{-1},从而有(A^{-1}+B^{-1})^{-1}=B(A+B)^{-1}A.
一个更正,问题中的“a=2/3”似乎有误,应为“a^Ta=2/3”首先可知A是一个对称阵,那么AA^T=E就等价于(E-3aa^T)(E-3aa^T)=E,展开就得E-6aa^T+9(a^Ta)(aa^T)=E,进一步合并同类项有:(9a^Ta-6)aa^T=0如果aa^T为零矩阵,则A=E,就过于特殊,故应不为零矩阵
这题的关键是证明:|A+E|=0证明:因为A是正交阵,所以AA'=E所以|A'||A+E|=|E+A'|又|A'|=|A|=-1所以|A+E|=-|E+A'|又 |A+E|=|(A+E)'|=|E+A'|所以|A+E|=0故-1是A的一个特征值
题目错的,把条件改成AA^T=0才对.补充:把x^TAx转置一下就明白了.
A是实对称矩阵,存在可逆矩阵P,使得P^(-1)AP=diag(λ1,λ2,λ3) A=Pdiag(λ1,λ2,λ3)P^(-1) A^2=[Pdiag(λ1,λ2,λ3)P^(-1)][Pdiag(λ1,λ2,λ3)P^(-1)]=Pdiag(λ1^2,λ2^2,λ3^2)P^(-1)=0∴λ1^2=λ2^2=λ3^
如下图所示,E是单位矩阵: 再问: 为何在倒数第四行可以交换A 和 (D-CAB)的位置? 在行列式符号中的A是代表分块的矩阵还是分块后矩阵的行列式的值? 究竟在何时可以交换? 再答: 前后顺序无关,|AB|=|A|×|B|=|B|×|A|=|BA|。 A,B,C,D,E皆是矩阵。再问: 请问怎样才能最快的想到把原式乘
1、A^3=3A(A-I),A^3-3A^2+3A -I=-I(I-A)^3=I,(I-A)可逆,且(I-A)^(-1)=(I-A)^22、C^(-1)AC=B.(C^(-1)AC)(C^(-1)AC).(C^(-1)AC)=B^m=C^(-1)(A^m)C
这个吗,有点难,等我宿舍的研究出来了再告诉你啊~
这是一个很简单的线代证明了!因为A^2=A,所以A(A-E)=0则有:R(A)+R(A-E)小于等于n又因为(A-E)+(-A)=-E则有:R(-A)+R(A-E)大于等于n由于R(-A)=R(A)所以R(A)+R(A-E)大于等于n由夹逼定理可知:R(A)+R(A-E)等于n陈文灯的数学考研辅导有专门介绍,就是一个定
答案不对.因为 A^2+aA+bE=0所以 A(A+aE) = -bE当b≠0时,A 可逆,且 A^-1 = -1/b (A+aE)..当b=0时,A(A+aE)=0,A的特征值只能是 0,-a而A可逆的充要条件是A的特征值全不为0所以A的特征值全部是-a,且 a≠0所以A为可逆矩阵的充分必要条件是b≠0,或者b=0且
A^k=0, 则 E-A^k=E, 即(E-A)[E+A+A^2+A^3+...+A^(k-1)]=E则 (E-A)^(-1) = E+A+A^2+A^3+...+A^(k-1).
特征方程|λEn-A|=0的根为λ1, λ2, … λn则|λEn-A|=(λ-λ1)(λ-λ2)…(λ-λn)=λ^n-(∑λi)λ^(n-1)+…+(-1)^n(∏λi)取λ=0,即得|-A|=(-1)^n(∏λi)因而|A|=∏λi,即λ1 •λ2 •…•λn=|A|再根据行列
A+B-AB=0A+B-AB-E=-E(A-E)(-B+E)=-E(A-E)(B-E)=E所以A-E可逆,(A-E)-1=B-E
img class="ikqb_img" src="http://b.hiphotos.baidu.com/zhidao/wh%3D600%2C800/sign=2ab1a94eaaca009ff3d3fd1fed241f95cad1c85e29.jpg"
...不知道还需要解答不?记B=A',就是要证明rank(B'B)=rank B.利用(1)维数定理 m = rank B + dim Ker(B)(2) Bx=0 当且仅当 B'Bx = 0 ,所以Ker(B)=Ker(B'B).这里Ker(B)表示由B确定的线性映射 y ---> By 的核,也就是方程 By=0
A·B=E,且为n阶方阵说明A B可逆两边左乘B得BAB=BE=B然后两边右乘B^(-1)得BABB^(-1)=BB^(-1)BA=E得证 满意请轻戳此处↓}

我要回帖

更多关于 a的转置矩阵的行列式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信