文档库 最新最全的文档下载
当前位置:文档库 › MatCalc----矩阵计算

MatCalc----矩阵计算

MatCalc----矩阵计算
MatCalc----矩阵计算

Notes on Matrix Calculus

Paul L.Fackler?

North Carolina State University

September27,2005

Matrix calculus is concerned with rules for operating on functions of matrices.For example,suppose that an m×n matrix X is mapped into a p×q matrix Y.We are interested in obtaining expressions for derivatives such as

?Y ij

?X kl

,

for all i,j and k,l.The main di?culty here is keeping track of where things are put.There is no reason to use subscripts;it is far better instead to use a system for ordering the results using matrix operations.

Matrix calculus makes heavy use of the vec operator and Kronecker products.The vec operator vectorizes a matrix by stacking its columns(it is convention that column rather than row stacking is used).For example, vectorizing the matrix

12 34 56

?Paul L.Fackler is an Associate Professor in the Department of Agricultural and Re-source Economics at North Carolina State University.These notes are copyrighted mate-rial.They may be freely copied for individual use but should be appropriated referenced in published work.

Mail:Department of Agricultural and Resource Economics

NCSU,Box8109

Raleigh NC,27695,USA

e-mail:paul fackler@https://www.wendangku.net/doc/171169668.html,

Web-site:https://www.wendangku.net/doc/171169668.html,/~pfackler/

c 2005,Paul L.Fackler

1

produces

1

3

5

2

4

6

The Kronecker product of two matrices,A and B,where A is m×n and B is p×q,is de?ned as

A?B=

A11B A12B...A1n B

A21B A22B...A2n B

............

A m1

B A m2B...A mn B

,

which is an mp×nq matrix.There is an important relationship between the Kronecker product and the vec operator:

vec(AXB)=(B ?A)vec(X).

This relationship is extremely useful in deriving matrix calculus results.

Another matrix operator that will prove useful is one related to the vec operator.De?ne the matrix T m,n as the matrix that transforms vec(A)into vec(A ):

T m,n vec(A)=vec(A ).

Note the size of this matrix is mn×mn.T m,n has a number of special properties.The?rst is clear from its de?nition;if T m,n is applied to the vec of an m×n matrix and then T n,m applied to the result,the original vectorized matrix results:

T n,m T m,n vec(A)=vec(A).

Thus

T n,m T m,n=I mn.

The fact that

T n,m=T?1

m,n

follows directly.Perhaps less obvious is that

T m,n=T n,m

2

(also combining these results means that T m,n is an orthogonal matrix).

The matrix operator T m,n is a permutation matrix,i.e.,it is composed of0s and1s,with a single1on each row and column.When premultiplying another matrix,it simply rearranges the ordering of rows of that matrix (postmultiplying by T m,n rearranges columns).

The transpose matrix is also related to the Kronecker product.With A and B de?ned as above,

B?A=T p,m(A?B)T n,q.

This can be shown by introducing an arbitrary n×q matrix C:

T p,m(A?B)T n,q vec(C)=T p,m(A?B)vec(C )

=T p,m vec(BC A )

=vec(ACB )

=(B?A)vec(C).

This implies that((B?A)?T p,m(A?B)T n,q)vec(C)=0.Because C is arbitrary,the desired result must hold.

An immediate corollary to the above result is that

(A?B)T n,q=T m,p(B?A).

It is also useful to note that T1,m=T m,1=I m.Thus,if A is1×n then (A?B)T n,q=(B?A).When working with derivatives of scalars this can result in considerable simpli?cation.

Turning now to calculus,de?ne the derivative of a function mapping n→ m as the m×n matrix of partial derivatives:

[Df]ij=?f i(x)?x j

.

For example,the simplest derivative is

dAx

dx

=A.

Using this de?nition,the usual rules for manipulating derivatives apply naturally if one respects the rules of matrix conformability.The summation rule is obvious:

D[αf(x)+βg(x)]=αDf(x)+βDg(x),

3

whereαandβare scalars.The chain rule involves matrix multiplication, which requires conformability.Given two functions f: n→ m and g: p→ n,the derivative of the composite function is

D[f(g(x))]=f (g(x))g (x).

Notice that this satis?es matrix multiplication conformability,whereas the expression g (x)f (g(x))attempts to postmultipy an n×p matrix by an m×n matrix.To de?ne a product rule,consider the expression f(x) g(x), where f,g: n→ m.The derivative is the1×n vector given by

D[f(x) g(x)]=g(x) f (x)+f(x) g (x).

Notice that no other way of multiplying g by f and f by g would ensure conformability.A more general version of the product rule is de?ned below.

The product rule leads to a useful result about quadratic functions:

dx Ax

dx

=x A+x A =x (A+A ).

When A is symmetric this has the very natural form dx Ax/dx=2x A.

These rules de?ne derivatives for vectors.De?ning derivatives of matri-ces with respect to matrices is accomplished by vectorizing the matrices,so dA(X)/dX is the same thing as d vec(A(X))/d vec(X).This is where the the relationship between the vec operator and Kronecker products is useful. Consider di?erentiating dx Ax with respect to A(rather than with respect to x as above):

d vec(x Ax) d vec(A)=

d(x ?x )vec(A)

d vec(A)

=(x ?x )

(the derivative of an m×n matrix A with respect to itself is I mn).

A more general product rule can be de?ned.Suppose that f: n→

m×p and g: n→ p×q,so f(x)g(x): n→ m×https://www.wendangku.net/doc/171169668.html,ing the relationship between the vec and Kronecker product operators

vec(I m f(x)g(x)I q)=(g(x) ?I m)vec(f(x))=(I q?f(x))vec(g(x)).

A natural product rule is therefore

Df(x)g(x)=(g(x) ?I m)f (x)+(I q?f(x))g (x).

This can be used to determine the derivative of dA A/dA where A is

m×n.

vec(A A)=(I n?A )vec(A)=(A ?I n)vec(A )=(A ?I n)T m,n vec(A).

4

Thus(using the product rule)

dA A

dA

=(I n?A )+(A ?I n)T m,n.

This can be simpli?ed somewhat by noting that

(A ?I n)T m,n=T n,n(I n?A ).

Thus

dA A

dA

=(I n2+T n,n)(I n?A ).

The product rule is also useful in determining the derivative of a matrix inverse:

dA?1A dA =(A ?I n)

dA?1

dA

+(I n?A?1).

But A?1A is identically equal to I,so its derivative is identically0.Thus

dA?1

dA

=?(A ?I n)?1(I n?A?1)=?(A? ?I n)(I n?A?1)=?(A? ?A?1).

It is also useful to have an expression for the derivative of a determinant. Suppose A is n×n with|A|=0.The determinant can be written as the

product of the i th row of the adjoint of A(A?)with the i th column of A: |A|=A?i·A·i.

Recall that the elements of the i th row of A?are not in?uenced by the elements in the i th column of A and hence

?|A|

?A·i

=A?i·.

To obtain the derivative with respect to all of the elements of A,we can concatenate the partial derivatives with respect to each column of A:

d|A| dA =[A?1·A?2·...A?n·]=|A|

[A?1]1·[A?1]2·...[A?1]n·

=|A|vec

A?

.

The following result is an immediate consequence

d ln|A| dA =vec

A?

.

5

Matrix di?erentiation results allow us to compute the derivatives of the solutions to certain classes of equilibrium problems.Consider,for example, the solution,x,to a linear complementarity problem LCP(M,q)that solves

Mx+q≥0,x≥0,x (Mx+q)=0

The i th element of x is either exactly equal to0or is equal to the i th element of Mx+q.De?ne a diagonal matrix D such that D ii=1if x>0and equal 0otherwise.The solution can then be written as x=??M?1Dq,where ?M=DM+I?D.It follows that

?x

?q

=??M?1D

and that

?x ?M =

?x

??M?1

??M?1

??M

??M

?M

=(?q D?I)(??M? ??M?1)(I?D) =q D?M? ??M?1D

=x ??x/?q

Given the prevalence of Kronecker products in matrix derivatives,it would be useful to have rules for computing derivatives of Kronecker prod-ucts themselves,i.e.dA?B/dA and dA?B/dB.Because each element of a Kronecker product involves the product of one element from A multiplied by one element of B,the derivative dA?B/dA must be composed of zeros and the elements of B arranged in a certain fashion.Similarly,the derivative dA?B/dB is composed of zeros and the elements of A arranged in a certain fashion.

6

It can be veri?ed that dA?B/dA can be written as

dA?B dA =

Ψ10 0

Ψ20 0

............

Ψq0 0

0Ψ1 0

0Ψ2 0

............

0Ψq 0

............

00...Ψ1

00...Ψ2

............

00...Ψq

=I n?

Ψ1

Ψ2

...

Ψq

where

Ψi=

B1i0 0

B2i0 0

............

B pi0 0

0B1i 0

0B2i 0

............

0B pi 0

............

00...B1i

00...B2i

............

00...B pi

=I m?B·i

This can be written more compactly as

dA?B

dA

=(I n?T qm?I p)(I mn?vec(B))=(I nq?T mp)(I n?vec(B)?I m).

7

Similarly dA?B/dB can be written as

dA?B dB =

Θ10 0

0Θ1 0

............

00...Θ1

Θ20 0

0Θ2 0

............

00...Θ2

............

Θq0 0

0Θq 0

............

00...Θq

where

Θi=

A i10 0

0A i1 0

............

00...A i1

A i20 0

0A i2 0

............

00...A i2

............

A im0 0

0A im 0

............

00...A im

.

This can be written more compactly as

dA?B

dB

=(I n?T qm?I p)(vec(A)?I pq)=(T pq?I mn)(I q?vec(A)?I p). Notice that if either A is a row vector(m=1)or B is a column vector

(q=1),the matrix(I n?T qm?I p)=Imnpq and hence can be ignored.

To illustrate a use for these relationships,consider the second derivative

of xx with respect to x,an n-vector.

dxx

dx

=x?I n+I n?x;

8

hence

d2xx

dxdx

=(T nn?I n)(I n?vec(I n)+vec(I n)?I n).

Another example is

d2A?1 dAdA =(I n?T nn?I n)

I n2?vec

A?1

T nn+

vec

A?

?I n2

A? ?A?1)

Often,especially in statistical applications,one encounters matrices that are symmetrical.It would not make sense to take a derivative with respect to the i,j th element of a symmetric matrix while holding the j,i th element constant.Generally it is preferable to work with a vectorized version of a symmetric matrix that excludes with the upper or lower portion of the matrix.The vech operator is typically taken to be the column-wise vector-ization with the upper portion excluded:

vech(A)=

A11

···

A n,1

A22

···

A n2

···

A nn?1

A nn

.

One obtains this by selecting elements of vec(A)and therefore we can write vech(A)=S n vec(A),

where S n is an n(n+1)/2×n2matrix of0s and1s,with a single1in each row.The vech operator can be applied to lower triangular matrices as well;there is no reason to take derivatives with respect to the upper part of a lower triangular matrix(it can also be applied to the transpose of an upper triangular matrix).The use of the vech operator is also important in e?cient computer storage of symmetric and triangular matrices.

To illustrate the use of the vech operator in matrix calculus applications, consider an n×n symmetric matrix C de?ned in terms of a lower triangular matrix,L,

C=LL .

9

Using the already familiar methods it is easy to see that

dC

dL

=(I n?L)T n,n+(L?I n).

Using the chain rule

d vech(C) d vech(L)=

d vech(C)

dC

dC

dL

dL

d vech(L)

=S n

dC

dL

S n.

Inverting this expression provides an expression for d vech(L)/d vech(C).

Related to matrix derivatives is the issue of Taylor expansions of matrix-to-matrix functions.One way to think of matrix derivatives is in terms of multidimensional arrays.An mn×pq matrix can also be thought of as an m×n×p×q4-dimensional array.The“reshape”function in MATLAB implements such transformations.The ordering of the individual elements has not change,only the way the elements are indexed.

The d th order Taylor expansion of a function f(X):R m×n→R p×q at ?X can be computed in the following way

f=vec(f(?X))

dX=vec(X??X)

for i=1to d

{

f i=f(i)(?X)dX

for j=2to i

f i=reshape(f i,mn(pq)j?2,pq)dX/j

f=f+f i

}

f=reshape(f,m,n)

The techniques described thus far can be applied to computation of derivatives of common“special”functions.First,consider the derivative of a nonnegative integer power A i of a square matrix A.Application of the chain rule leads to the recursive de?nition

dA i dA =

dA i?1A

dA

=(A ?I)

dA i?1

dA

+(I?A i?1)

which can also be expressed as a sum of i terms

dA i dA =

i

j=1

(A )i?j?A j?1.

10

This result can be used to derive an expression for the derivative of the matrix exponential function,which is de?ned in the usual way in terms of a Taylor expansion:

exp(A)=

i=0

A i

i!

.

Thus

d exp(A)

dA =

i=0

1

i!

i

j=1

(A )i?j?A j?1.

The same approach can be applied to the matrix natural logarithm:

ln(A)=?

i=1

1

i

(I?A)i.

11

Summary of Operator Results

A is m×n,

B is p×q,X is de?ned comformably.

A?B=

A11B A12B...A1n B

A21B A22B...A2n B

............

A m1

B A m2B...A mn B

(AC?BD)=(A?B)(C?D) (A?B)?1=A?1?B?1

(A?B) =A ?B

vec(AXB)=(B ?A)vec(X) trace(AX)=vec(A ) vec(X) trace(AX)=trace(XA)

T m,n vec(A)=vec(A )

T n,m T m,n=I mn

T n,m=T?1

m,n

T m,n=T n,m

B?A=T p,m(A?B)T n,q

12

Summary of Di?erentiation Results

A is m×n,

B is p×q,x is n×1,X is de?ned comformably.

[Df]ij=d f i(x) dx j

dAx

dx

=A

D[αf(x)+βg(x)]=αDf(x)+βDg(x)

D[f(g(x))]=f (g(x))g (x)

D[f(x)g(x)]=(g(x) ?I m)f (x)+(I p?f(x))g (x). dx Ax

dx

=x (A+A )

d vec(x Ax)

d vec(A)

=(x ?x )

dA A

dA

=(I n2+T n,n)(I n?A )

dAA

dA

=(I m2+T m,m)(A?I m)

dx A Ax

dA

=2x ?x A (when x is a vector) dx AA x

dA

=2x A?x (when x is a vector) dAXB

dX

=B ?A

dA?1

dA

=?(A? ?A?1)

d ln|A|

dA

=vec(A? )

d trace(AX)

dX

=vec(A )

13

dA?B

dA

=(I n?T qm?I p)(I mn?vec(B))=(I nq?T mp)(I n?vec(B)?I m). dA?B

dB

=(I n?T qm?I p)(vec(A)?I pq)=(T pq?I mn)(I q?vec(A)?I p).

dxx

dx

=x?I n+I n?x

d2xx

dxdx

=(T nn?I n)(I n?vec(I n)+vec(I n)?I n)

dA i dA =(A ?I)

dA i?1

dA

+(I?A i?1)=

i

j=1

(A )i?j?A j?1.

d exp(A)

dA =

i=0

1

i!

i

j=1

(A )i?j?A j?1.

14

实现稀疏矩阵(采用三元组表示)的基本运算实验报告

实现稀疏矩阵(采用三元组表示)的基本运算实验报告 一实验题目: 实现稀疏矩阵(采用三元组表示)的基本运算二实验要求: (1)生成如下两个稀疏矩阵的三元组 a 和 b;(上机实验指导 P92 )(2)输出 a 转置矩阵的三元组; (3)输出a + b 的三元组; (4)输出 a * b 的三元组; 三实验内容: 稀疏矩阵的抽象数据类型: ADT SparseMatrix { 数据对象:D={aij| i = 1,2,3,….,m; j =1,2,3,……,n; ai,j∈ElemSet,m和n分别称为矩阵的行数和列数} 数据关系: R={ Row , Col } Row ={ | 1≤i≤m , 1≤j ≤n-1} Col ={| 1≤i≤m-1,1≤j ≤n} 基本操作:

CreateSMatrix(&M) 操作结果:创建稀疏矩阵 M PrintSMatrix(M) 初始条件:稀疏矩阵M已经存在 操作结果:打印矩阵M DestroySMatrix(&M) 初始条件:稀疏矩阵M已经存在 操作结果:销毁矩阵M CopySMatrix(M, &T) 初始条件:稀疏矩阵M已经存在 操作结果:复制矩阵M到T AddSMatrix(M, N, &Q) 初始条件:稀疏矩阵M、N已经存在 操作结果:求矩阵的和Q=M+N SubSMatrix(M, N, &Q) 初始条件:稀疏矩阵M、N已经存在 操作结果:求矩阵的差Q=M-N TransposeSMatrix(M, & T) 初始条件:稀疏矩阵M已经存在 操作结果:求矩阵M的转置T MultSMatrix(M, N, &Q) 初始条件:稀疏矩阵M已经存在

剪力墙如何根据SATWE计算结果正确配筋

剪力墙如何根据SATWE计算结果 配筋 假设此楼层为构造边缘构件,剪力墙厚度为200, 剪力墙显示“0”是指边缘构件不需要配筋且不考虑构造配筋(此时按照高规表7.2.16来配),当墙柱长小于3倍的墙厚或一字型墙截面高度不大于800mm 时,按柱配筋,此时表示柱对称配筋计算的单边的钢筋面积。 水平钢筋:H0.8是指Swh范围内的水平分布筋面积(cm2),Swh范围指的就是Satwe参数中的墙水平分布筋间距,是指的双侧的,先换算成1米内的配筋值,再来配,比如你输入的间距是200 mm ,计算结果是H0.8,那就用0.8*100 (乘以100是为了把cm2转换为mm2)*1000/200=400mm2 再除以2 就是 200mm2 再查板配筋表就可以了所以配8@200面积250>200 满足要求了!(剪力墙厚度为200,直径8间距200 配筋率 =2*50.24/(200*200)=0.25%,最小配筋率为排数*钢筋面 积/墙厚度*钢筋间距)。 竖向钢筋:计算过程1000X200X0.25%=500mm2,同样是指双侧,除以2就是250mm2,Φ8@200(面积251mm2)足够。 Satwe参数中的竖向配筋率是可根据工程需要调整的,当边缘构件配筋过大时,可提高竖向配筋率。

剪力墙边缘构件中的纵向钢筋间距应该和箍筋(拉筋)的选用综合考虑 一般情况下,墙的钢筋为构造钢筋,不过在屋面层短墙在大偏心受压下有时配筋很大 墙竖向分布筋配筋率0.3%进行计算是不对的。应该填0.25%(或者0.20%)。 如果填了0.3%,实际配了0.25%,则造成边缘构件主筋配筋偏小。墙竖向分 布筋按你输入配筋率,水平配筋按你输入的钢筋间距根据计算结果选筋。 规范规定的:剪力墙竖向和水平分布钢筋的配筋率,一、二、三级时均不应小于0.25%,四级和非抗震设计时均不应小于0.20%,此处的“配筋率”为水平截面全截面的配筋率,以200mm厚剪力墙为例,每米的配筋面积为:0.25% x 200 x 1000 = 500mm2,双排筋,再除以2,每侧配筋面积为250mm2,查配筋表,φ8@200配筋面积 为251mm2,刚好满足配筋率要求。 至于边缘构件配筋,一般是看SATWE计算结果里面的第三项:“梁弹性挠度、柱轴压比、墙边缘构件简图”一项里面的“边缘构件”,按此配筋,如果出现异常配筋,比如配筋率过大的情况,就用第十五项:“剪力墙组合配筋修改及验算”一项进行组合墙配筋计算,

数据结构稀疏矩阵基本运算实验报告

课程设计 课程:数据结构 题目:稀疏矩阵4 三元组单链表结构体(行数、列数、头) 矩阵运算重载运算符优 班级: 姓名: 学号: 设计时间:2010年1月17日——2010年5月XX日 成绩: 指导教师:楼建华

一、题目 二、概要设计 1.存储结构 typedef struct{ int row,col;//行,列 datatype v;//非0数值 }Node; typedef struct{ Node data[max];//稀疏矩阵 int m,n,t;//m 行,n 列,t 非0数个数 … … 2.基本操作 ⑴istream& operator >>(istream& input,Matrix *A)//输入 ⑵ostream& operator <<(ostream& output,Matrix *A){//输出 ⑶Matrix operator ~(Matrix a,Matrix b)//转置 ⑷Matrix operator +(Matrix a,Matrix b)//加法 ⑸Matrix operator -(Matrix a,Matrix b)//减法 ⑹Matrix operator *(Matrix a,Matrix b)//乘法 ⑺Matrix operator !(Matrix a,Matrix b)//求逆 三、详细设计 (1)存储要点 position[col]=position[col-1]+num[col-1]; 三元组表(row ,col ,v) 稀疏矩阵((行数m ,列数n ,非零元素个数t ),三元组,...,三元组) 1 2 3 4 max-1

并行计算-实验二-矩阵乘法的OpenMP实现及性能分析

深圳大学 实验报告 课程名称:并行计算 实验名称:矩阵乘法的OpenMP实现及性能分析姓名: 学号: 班级: 实验日期:2011年10月21日、11月4日

一. 实验目的 1) 用OpenMP 实现最基本的数值算法“矩阵乘法” 2) 掌握for 编译制导语句 3) 对并行程序进行简单的性能 二. 实验环境 1) 硬件环境:32核CPU 、32G 存计算机; 2) 软件环境:Linux 、Win2003、GCC 、MPICH 、VS2008; 4) Windows 登录方式:通过远程桌面连接192.168.150.197,用户名和初始密码都是自己的学号。 三. 实验容 1. 用OpenMP 编写两个n 阶的方阵a 和b 的相乘程序,结果存放在方阵c 中,其中乘法用for 编译制导语句实现并行化操作,并调节for 编译制导中schedule 的参数,使得执行时间最短,写出代码。 方阵a 和b 的初始值如下: ????????? ? ??????????-++++=12,...,2,1,..2,...,5,4,31,...,4,3,2,...,3,2,1n n n n n n n a ???????? ? ???????????= 1,...,1,1,1..1,...,1,1,11,...,1,1,11,..., 1,1,1b 输入: 方阵的阶n 、并行域的线程数 输出: c 中所有元素之和、程序的执行时间 提示: a,b,c 的元素定义为int 型,c 中所有元素之各定义为long long 型。 Windows 计时: 用中的clock_t clock( void )函数得到当前程序执行的时间 Linux 计时: #include

边缘构件选筋规则

精心整理边缘构件选筋规则 纵筋的选筋规则 1)按照纵筋的最大间距和最小间距计算确定边缘构件纵筋的允许根数范围; 2)按照纵筋的优选间距计算出优选纵筋根数(在根数范围内),根据该边缘构件需要的纵筋面积计算出纵筋直径规格,如果该规格在纵筋直径优选序列中且不小于最小构造直径要求则纵筋选配成功; 3)如果按优选间距未成功选配,则按纵筋直径优选序列进行选配。先对排在最前面的满足最小构 4)如果仍未配出,程序自动逐次增加两根纵筋并重选纵筋直径,直至能选配出箍筋或者纵筋根数达到构造最多根数。所以一般情况下,很少会有选配不出来箍筋的情况。 5)如果有选配失败的情况,软件将标记为N/A(NotAvailable,不可用)。 约束边缘构件非阴影区箍筋的选筋规则

约束边缘构件非阴影区只对配箍提出了要求,非阴影区的箍筋需要墙身的竖向分布筋来固定,所以其位置需要尽量与墙身的竖向分布筋协调。同时为了尽量利用墙身的水平分布筋替代非阴影区的封闭箍,还需要考虑非阴影区的箍筋间距与墙身水平分布筋的直径、间距协调问题。 所以本软件在约束边缘构件非阴影区箍筋的选筋中执行的是协调优选原则,具体来说: 1)非阴影区拉筋的水平间距(肢距)取200mm和相应墙身竖向分布筋间距的较小者,非阴影区长度200和竖向分布筋间距的较小者的整数倍且不小于计算值(参见04SG330P4); 2)如果墙身配筋强度等级和直径不小于边缘构件箍筋等级情况下,可以考虑用墙身水平分布筋替代封闭箍筋。 3 注意:(优先级低) 4 显大于2 尽量是 5 6 条件, 的钢筋, 箍钢筋条件,则完全标记为等级直径@竖向间距。如下右图中的Ф8@100表示:非阴影区长度为600mm,采用一级直径为8mm的钢筋,竖向间距同阴影区箍筋的间距为100mm,水平间距同墙竖向分布筋间距为150mm。这种情况下,是否还可以由墙身水平筋替代非阴影区封闭箍钢筋,由设计方和施工单位判断,比如右图示意情况下还可以部分利用墙身水平筋替代非阴影区封闭箍钢筋。 边缘构件箍筋计入墙水平分布筋原则 约束边缘构件和构造边缘构件均可以选择考虑墙水平分布筋。 《高规》第7.2.15明确提出约束边缘构件可以考虑墙水平分布筋的。 图集11G101-1给出了剪力墙水平分布筋计入约束边缘构件体积配箍率的做法。

矩阵相关运算

1.2.10矩阵的迹 函数trace 格式b=trace (A) %返回矩阵A的迹,即A的对角线元素之和。 1.2.11矩阵和向量的范数 命令向量的范数 函数norm 格式n = norm(X) %X为向量,求欧几里德范数,即。 n = norm(X,inf) %求-范数,即。 n = norm(X,1) %求1-范数,即。 n = norm(X,-inf) %求向量X的元素的绝对值的最小值,即。 n = norm(X, p) %求p-范数,即,所以norm(X,2) = norm(X)。 命令矩阵的范数 函数norm 格式n = norm(A) %A为矩阵,求欧几里德范数,等于A的最大奇异值。 n = norm(A,1) %求A的列范数,等于A的列向量的1-范数的最大值。 n = norm(A,2) %求A的欧几里德范数,和norm(A)相同。 n = norm(A,inf) %求行范数,等于A的行向量的1-范数的最大值 即:max(sum(abs(A')))。 n = norm(A, 'fro' ) %求矩阵A的Frobenius范数, 即sqrt(sum(diag(A'*A))),不能用矩阵p-范数的定义来求。 命令范数的估计值 函数normest 格式nrm = normest(A) %矩阵A的2-范数(欧几里德范数)的估计值,相对误差小于 106。 nrm = normest(A,tol) %tol为指定相对误差 [nrm,count] = normest(…) %count给出计算估计值的迭代次数 1.2.12条件数 命令矩阵的条件数 函数cond 格式c = cond(X) %求X的2-范数的条件数,即X的最大奇异值和最小奇异值的商。 c = cond(X,p) %求p-范数的条件数,p的值可以是1、2、inf或者’fro’。 说明线性方程组AX=b的条件数是一个大于或者等于1的实数,用来衡量关于数据中的扰动,也就是A/或b对解X的灵敏度。一个差条件的方程组的条件数很大。条件数的定义为: 命令1-范数的条件数估计 函数condest 格式c = condest (A) %方阵A的1-范数的条件数的下界估值。 [c,v] = condest (A) %v为向量,满足,即norm(A*v,1) =norm(A,1)*norm(v,1)/c。 [c,v] = condest (A,t) %求上面的c和v,同时显示出关于计算的步骤信息。如果t=1,则计算的 每步都显示出来;如果t=-1,则给出商c/rcond(A)。 命令矩阵可逆的条件数估值 函数rcond 格式c = rcond(A) %对于差条件矩阵A来说,给出一个接近于0的数;对于好条件矩阵A, 则给出一个接近于1的数。 命令特征值的条件数 函数condeig

数据结构实验4-2

实验2稀疏矩阵的表示和转置 实验人:学号:时间:2019.4.8 一、实验目的 1.掌握稀疏矩阵的三元组顺序表存储结构 2.掌握稀疏矩阵的转置算法。 二、实验内容 采用三元组表存储表示,求稀疏矩阵M的转置矩阵T。(算法5.1) 三、实验步骤: 1.构建稀疏矩阵M。 2.求稀疏矩阵M的转置矩阵T。 3.输出稀疏矩阵M和稀疏矩阵T。 四、算法说明 1.首先应输入矩阵的行数、列数和非零个数。 2.其次输入你所构建的稀疏矩阵,采用三元组顺序表存储表示,并判别给出的两个矩 阵的行、列数进行稀疏矩阵的转置时要做到,将每个三元组的i,j相互调换;并且重排三元组之间的次序便可实现矩阵的转置。 3.主函数设置循环和选择语句进行运算循环和选择,进行稀疏矩阵的转置。 五、测试结果

六、分析与探讨 这次实验是稀疏矩阵的表示和转置编写的程序题,但是有关稀疏矩阵的写法在我平时上课时我就感觉有点难消化,以及对于矩阵的相关知识和三元组表的相关知识方面已经有些遗忘了。所以在编写实验内容之前我把数据结构书上有关稀疏矩阵的内容反反复复又看了两遍,了解了三元组顺序表、行逻辑链接的顺序表以及十字表的方法。在这次程序编写中我用到了三元组顺序表的方法。首先,根据实验内容采用三元组表存储表示,求稀疏矩阵M的转置矩阵T所围绕的程序算法5.1进行编程以及调试;其次,根据课程设计的要求进行实验目的以及实验意义的分析;最后,根据实验步骤对主函数main 进行编写,将项目设计的算法思想,基本算法,主函数调用一一呈现出来。主函数中主要包含构建稀疏矩阵M,输出构建稀疏矩阵M以及转置矩阵T三个部分。在整个课程设计中总是在编写程序中发生一些很小的错误,比如对元素缺少定义、缺个分号以及大小写方面。在编写的时候总会很粗心,有时会很没耐性,但都被我一一克服了,同时还有认真仔细,尽量保证不出现错误,看到自己的代码错误少了,也会更有信心和动力。最后,编程时要注意要有条理,这样有利于修改错误,减少时间的花费。 七、附录:源代码 源代码列在附录中,要求程序风格清晰易理解,有充分的注释。有意义的注释行不 少于30%。 #include #define MAXSIZE 5 #define MAXMN 200 #define OK 1 typedef struct { int i,j; //该非零元的行下标和列下标 int e; }Triple; typedef struct { Triple data[MAXSIZE+1]; //非零元三元组表,data[0]未用 int mu,nu,tu; //矩阵的行数、列数和非零个数 }TSMatrix; //行逻辑连接的顺序表 int FastTransposeSMatrix(TSMatrix M,TSMatrix &T)

并行计算矩阵分块乘法

目录 一、题目及要求 (1) 1、题目 (1) 2、要求 (1) 二、设计算法、算法原理 (1) 三、算法描述、设计流程 (2) 3.1算法描述 (2) 3.2设计流程 (4) 四、源程序代码及运行结果 (6) 1、超立方 (6) 1.1超立方的源程序代码 (6) 1.2运行结果 (11) 2、网孔连接 (11) 2.1源程序代码 (11) 2.2运行结果 (18) 3、在数学软件中的计算结果 (19) 五、算法分析、优缺点 (19) 1、简单的并行分块乘法的过程为 (19) 2、使用Cannon算法时的算法分析 (20) 3、算法的优缺点 (21) 六、总结 (22) 参考文献 (23)

一、题目及要求 1、题目 简单并行分块乘法:(1)情形1: 超立方连接;(2)情形2:二维环绕网孔连接 已知,177511195310135411274329,7563895712314 2120143321 ?????? ? ??----=??????? ??----=B A 求B A C ?=。 2、要求 (1)题目分析、查阅与题目相关的资料; (2)设计算法; (3)算法实现、代码编写; (4)结果分析和性能分析与改进; (5)论文撰写、答辩; 二、设计算法、算法原理 要考虑的计算问题是C=AB,其中A 与B 分别是n n ?矩阵。 ①A 、B 和C 分成p p p ?=的方块阵ij A ,ij B 和ij C ,大小均为p n p n ? ,p 个处理器编号为1 ,1, (1) 0,....,0,0---p p p p p p , ij P 存放ij A ,ij B 和ij C 。 ②通讯:每行处理器进行A 矩阵块的多到多播送(得到ik A , k=0~1-p ) 每列处理器进行B 矩阵块的多到多播送(得到kj B , k=0~ 1-p ) ③乘-加运算: ij P 做kj p k ik ij B A C ∑-== 1

实现稀疏矩阵(采用三元组表示)的基本运算实验分析报告

实现稀疏矩阵(采用三元组表示)的基本运算实验报告

————————————————————————————————作者:————————————————————————————————日期: 2

实现稀疏矩阵(采用三元组表示)的基本运算实验报告 一实验题目: 实现稀疏矩阵(采用三元组表示)的基本运算二实验要求: (1)生成如下两个稀疏矩阵的三元组 a 和 b;(上机实验指导 P92 )(2)输出 a 转置矩阵的三元组; (3)输出a + b 的三元组; (4)输出 a * b 的三元组; 三实验内容: 3.1 稀疏矩阵的抽象数据类型: ADT SparseMatrix { 数据对象:D={aij| i = 1,2,3,….,m; j =1,2,3,……,n; ai,j∈ElemSet,m和n分别称为矩阵的行数和列数 } 数据关系 : R={ Row , Col } Row ={ | 1≤ i≤m , 1≤ j≤ n-1} Col ={| 1≤i≤m-1,1≤j≤n} 基本操作: CreateSMatrix(&M) 操作结果:创建稀疏矩阵M PrintSMatrix(M) 初始条件:稀疏矩阵M已经存在 操作结果:打印矩阵M DestroySMatrix(&M) 初始条件:稀疏矩阵M已经存在 操作结果:销毁矩阵M CopySMatrix(M, &T) 初始条件:稀疏矩阵M已经存在 操作结果:复制矩阵M到T AddSMatrix(M, N, &Q) 初始条件:稀疏矩阵M、N已经存在 操作结果:求矩阵的和Q=M+N SubSMatrix(M, N, &Q) 3

稀疏矩阵的运算(完美版)

专业课程设计I报告(2011 / 2012 学年第二学期) 题目稀疏矩阵的转换 专业软件工程 学生姓名张鹏宇 班级学号 09003018 指导教师张卫丰 指导单位计算机学院软件工程系 日期 2012年6月18号

指导教师成绩评定表

附件: 稀疏矩阵的转换 一、课题内容和要求 1.问题描述 设计程序用十字链表实现稀疏矩阵的加、减、乘、转置。 2.需求分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 二、设计思路分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 三、概要设计 为了实现以上功能,可以从3个方面着手设计。 1.主界面设计 为了实现对稀疏矩阵的多种算法功能的管理,首先设计一个含有多个菜单项的主

控菜单子程序以链接系统的各项子功能,方便用户交互式使用本系统。本系统主控菜单运行界面如图所示。 2.存储结构设计 本系统采用单链表结构存储稀疏矩阵的具体信息。其中:全部结点的信息用头结点为指针数组的单链表存储。 3.系统功能设计 本系统除了要完成稀疏矩阵的初始化功能外还设置了4个子功能菜单。稀疏矩阵的初始化由函数i typedef int ElemType 实现。建立稀疏矩阵用void Creat()实现,依据读入的行数和列数以及非零元素的个数,分别设定每个非零元素的信息。4个子功能的设计描述如下。 (1)稀疏矩阵的加法: 此功能由函数void Xiangjia( )实现,当用户选择该功能,系统即提示用户初始化要进行加法的两个矩阵的信息。然后进行加法,最后输出结果。 (2)稀疏矩阵的乘法: 此功能由函数void Xiangcheng( )实现。当用户选择该功能,系统提示输

数据结构实验报告(实验五 稀疏矩阵运算器)

韶关学院 学生实验报告册 实验课程名称:数据结构与算法 实验项目名称:实验五数组及其应用 稀疏矩阵运算器 实验类型(打√):(基础、综合、设计√) 院系:信息工程学院计算机系专业:***** 姓名:*** 学号:***** 指导老师:陈正铭 韶关学院教务处编制

一、实验预习报告内容

二、实验原始(数据)记录 实验时间:2007 年 5 月30日(星期三第7,8 节)实验同组人:

三、实验报告内容 2007年 5 月30 日

注:1、如有个别实验的实验报告内容多,实验报告册页面不够写,或有识图,画图要求的,学生应根据实验指导老师要求另附相同规格的纸张并粘贴在相应的“实验报告册”中。 2、实验报告册属教学运行材料,院系(中心)应按有关规定归档保管。

【源程序】 #include #include #include #define maxsize 100 #define maxrow 100 #define OK 1 #define ERROR -1 typedef struct{ int row; //行数 int col; //列数 int v; //非零元素值 }triplenode; typedef struct{ triplenode data[maxsize+1]; //非零元三元组 int rowtab[maxrow+1]; //各行第一个非零元的位置表 int mu,nu,tu; //矩阵的行数、列数和非零元个数}rtripletable; void creat(rtripletable &A) //创建稀疏矩阵 { int k=1,sum=1,loop,p,t; int num[maxrow+1]; cout<<"请输入矩阵的行数和列数:"<>A.mu; cout<<"列数:";cin>>A.nu; cout<<"非零元素个数:";cin>>A.tu; cout<<"请按行,列和值的形式输入该矩阵的非零元.并以全零为结束标记!"<>A.data[loop].row>>A.data[loop].col>>A.d ata[loop].v; //输入三元组的行数,列数和非零元素值 } for(p=1;p<=A.mu;p++) num[p]=0; //A三元组每一列的非零元素个数 for(t=1;t<=A.tu;t++) ++num[A.data[t].row]; //求A中每一列含非零元个数 A.rowtab[1]=1; //求第p列中第一个非零元在A.data中的序号for(t=2;t<=A.mu;t++) A.rowtab[t]=A.rowtab[t-1]+num[t-1]; return; } void print(rtripletable A) //输出稀疏矩阵 { int result[maxrow+1][maxrow+1]; //定义一个二维数组 int loop1,loop2; for(loop1=1;loop1<=A.mu;loop1++) for(loop2=1;loop2<=A.nu;loop2++) result[loop1][loop2]=0; //初始化为0 for(loop1=1;loop1<=A.tu;loop1++) result[A.data[loop1].row][A.data[loop1].col]=A.dat a[loop1].v; for(loop1=1;loop1<=A.mu;loop1++) { cout<<"|"; for(loop2=1;loop2<=A.nu;loop2++) cout<

剪力墙边缘构件的配筋计算刘孝国

1.工程实例: 第一类:短肢墙的边缘构件 (一):构件信息 图一 横向墙的信息如下: 混凝土墙短肢墙加强区,截面参数(m)B*H=0.300*0.700 抗震构造措施的抗震等级NF=3AS=873.(图一取为9) 竖向墙肢的信息如下: 混凝土墙短肢墙加强区,截面参数(m)B*H=0.300*1.850 墙分布筋间距(mm)SW=200.0 抗震构造措施的抗震等级NF=3计算配筋为0 (二):边缘构件信息:

上部 中部 下部 图二 (三):配筋计算结果及过程 图二中,竖向墙肢上部(标注上部的地方)边缘构件配筋信息及计算过程: 第28号:约束边缘构件 抗震等级:3 楼层属性:加强层 竖向墙肢总长度1850,底部加强区三级短肢剪力墙的最小配筋率1%(高规规定),墙宽300,所以整个墙肢的配筋为: 1850*300*1%=5550(cm2) 图二中间部分按照分布筋配筋(分布筋配筋率为0.25%): (1850-400-400)*300*0.25%=787.5 剩下的部分两边边缘构件按面积分配,两边面积相同 所以上部边缘构件配筋面积为: (5550-787.5)/2=2381.25(cm2)(包括竖向分布筋和阴影区纵筋?) 图中横向墙肢的配筋:从构件信息中知道AS=873 横向墙肢总长700,计算的时候,aa取40 (350-40)*300*0.25%=232.5 计算配筋+分布筋=873+232.5=1105.5 两边分布筋相等,下面也是232.5 图二下部第15号:约束边缘构件 楼层属性:加强层 由2个边缘构件合并而成

(1)纵筋原始数据: 阴影区面积(cm2):2700.0:(300*300+300*600=270000) 构造配筋率(%): 1.00 构造配筋(mm2):2700.00 计算配筋(mm2):3487.15 3487.15=下部配筋面积+分布筋面积+横向墙右侧配筋=2381+873+232.5 (2)纵筋当前结果: 采用最大构造配筋率的计算结果:3900.00 构造钢筋取值:采用求和后,再调整的算法(3900.00) 有效阴影区面积(cm2):3900.0 构造配筋(mm2):3900.00 计算配筋(mm2):4593.07(=3487.15+1105) 主筋配筋率(%): 1.18 第二类:转角加洞口的边缘构件 异形柱框剪的工程,6层,按照规范此工程是3级框架,2级剪力墙,底部一层加强区,构造配筋率0.008Ac和6Φ14中较大值,为其他部位的构造配筋为0.006Ac和6Φ12,那PKPM 里的构造边缘构件的配筋率0.94怎么来的?

2.2 矩阵变换(PPT)

专题二 MATLAB矩阵处理 2.2 矩阵变换 ?对角阵 ?三角阵 ?矩阵的转置 ?矩阵的旋转 ?矩阵的翻转 ?矩阵求逆

1.对角阵 ?对角阵:只有对角线上有非零元素的矩阵。 ?数量矩阵:对角线上的元素相等的对角矩阵。?单位矩阵:对角线上的元素都为1的对角矩阵。

(1) 提取矩阵的对角线元素 ?diag(A):提取矩阵A主对角线元素,产生一个列向量。 ?diag(A,k):提取矩阵A第k条对角线的元素,产生一个列向量。 矩阵的对角线:与主对角线平 行,往上为第1条、第2条、一 直到第n条对角线,往下为第- 1条、-2条、一直到-n条对角 线。主对角线为第0条对角线。

(2) 构造对角阵 ?diag(V):以向量 V为主对角线元素,产生对角矩阵。 ?diag(V,k):以向量 V为第k条对角线元素,产生对角矩阵。

例1 先建立5×5矩阵A ,然后将A 的第一行元素乘以1,第二行乘以2,…,第五行乘以5。 用一个对角阵左乘一个矩阵时,相当于用对角阵对角线的第1个元素乘以该矩阵的第一行,用对角阵对角线的第2个元素乘以该矩阵 的第二行,…,依此类推。 >> A=[7,0,1,0,5;3,5,7,4,1;4,0,3,0,2;1,1,9,2,3;1,8,5,2,9] A = 7 0 1 0 5 3 5 7 4 1 4 0 3 0 2 1 1 9 2 3 1 8 5 2 9 >> D=diag(1:5); >> D*A ans = 7 0 1 0 5 6 10 14 8 2 12 0 9 0 6 4 4 36 8 12 5 40 25 10 45

稀疏矩阵的运算(完美版)

专业课程设计I报告( 2011 / 2012 学年第二学期) 题目稀疏矩阵的转换 专业软件工程 学生姓名张鹏宇 班级学号 09003018 指导教师张卫丰 指导单位计算机学院软件工程系 日期 2012年6月18号

指导教师成绩评定表

附件: 稀疏矩阵的转换 一、课题内容和要求 1.问题描述 设计程序用十字链表实现稀疏矩阵的加、减、乘、转置。 2.需求分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 二、设计思路分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 三、概要设计 为了实现以上功能,可以从3个方面着手设计。 1.主界面设计 为了实现对稀疏矩阵的多种算法功能的管理,首先设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户交互式使用本系统。本系统主控菜单运行界面如图所示。

2.存储结构设计 本系统采用单链表结构存储稀疏矩阵的具体信息。其中:全部结点的信息用头结点为指针数组的单链表存储。 3.系统功能设计 本系统除了要完成稀疏矩阵的初始化功能外还设置了4个子功能菜单。稀疏矩阵的初始化由函数i typedef int ElemType 实现。建立稀疏矩阵用void Creat()实现,依据读入的行数和列数以及非零元素的个数,分别设定每个非零元素的信息。4个子功能的设计描述如下。 (1)稀疏矩阵的加法: 此功能由函数void Xiangjia( )实现,当用户选择该功能,系统即提示用户初始化要进行加法的两个矩阵的信息。然后进行加法,最后输出结果。 (2)稀疏矩阵的乘法: 此功能由函数void Xiangcheng( )实现。当用户选择该功能,系统提示输入要进行相乘的两个矩阵的详细信息。然后进行相乘,最后得到结果。 (3)稀疏矩阵的转置: 此功能由函数void Zhuanzhi( )实现。当用户选择该功能,系统提示用户初始

剪力墙如何根据SATWE计算结果配筋

剪力墙如何根据SATWE计算结果配筋 | 假设此楼层为构造边缘构件,剪力墙厚度为200, 剪力墙显示“0”是指边缘构件不需要配筋且不考虑构造配筋(此时按照高规表7.2.16来配),当墙柱长小于3倍的墙厚或一字型墙截面高度不大于800mm时,按柱配筋,此时表示柱对称配筋计算的单边的钢筋面积。 水平钢筋:H0.8是指Swh范围内的水平分布筋面积(cm2),Swh范围指的就是Satwe 参数中的墙水平分布筋间距,是指的双侧的,先换算成1米内的配筋值,再来配,比如你输入的间距是200 mm ,计算结果是H0.8,那就用0.8*100(乘以100是为了把cm2转换为mm2)*1000/200=400mm2 再除以2 就是200mm2 再查板配筋表就可以了所以配8@200面积250>200 满足要求了!(剪力墙厚度为200,直径8间距200 配筋率 =2*50.24/(200*200)=0.25%,最小配筋率为排数*钢筋面积/墙厚度*钢筋间距)。 竖向钢筋:计算过程1000X200X0.25%=500mm2,同样是指双侧,除以2就是250mm2,Φ8@200(面积251mm2)足够。 Satwe参数中的竖向配筋率是可根据工程需要调整的,当边缘构件配筋过大时,可提高竖向配筋率。 剪力墙边缘构件中的纵向钢筋间距应该和箍筋(拉筋)的选用综合考虑 一般情况下,墙的钢筋为构造钢筋,不过在屋面层短墙在大偏心受压下有时配筋很大墙竖向分布筋配筋率0.3%进行计算是不对的。应该填0.25%(或者0.20%)。如果填了0.3%,实际配了0.25%,则造成边缘构件主筋配筋偏小。墙竖向分布筋按你输入配筋率,水平配筋按你输入的钢筋间距根据计算结果选筋。 规范规定的:剪力墙竖向和水平分布钢筋的配筋率,一、二、三级时均不应小于0.25%,四级和非抗震设计时均不应小于0.20%,此处的“配筋率”为水平截面全截面的配筋率,以200mm厚剪力墙为例,每米的配筋面积为:0.25% x 200 x 1000 = 500mm2,双排筋,再除以2,每侧配筋面积为250mm2,查配筋表,φ8@200配筋面积为251mm2,刚好满足配筋率要求。 至于边缘构件配筋,一般是看SATWE计算结果里面的第三项:“梁弹性挠度、柱轴压比、墙边缘构件简图”一项里面的“边缘构件”,按此配筋,如果出现异常配筋,比如配筋率过大的情况,就用第十五项:“剪力墙组合配筋修改及验算”一项进行组合墙配筋计算,

矩阵

特殊矩阵的压缩存储 对称矩阵中的元素关于主对角线对称,因此,让每一对对称元素a ij和a ji(i≠j)分配一个存储空间,则n2个元素压缩存储到n(n+1)/2个存储空间,能节约近一半的存储空间。 不失一般性,假设按“行优先顺序”存储下三角形(包括对角线)中的元素。 设用一维数组(向量)sa[0…n(n+1)/2]存储n阶对称矩阵,如图5-4所示。为了便于访问,必须找出矩阵A中的元素的下标值(i,j)和向量sa[k]的下标值k之间的对应关系。 若i≧j:a i j在下三角形中,直接保存在sa中。a i j之前的i-1行共有元素个数:1+2+…+(i-1)=i?(i-1)/2 而在第i行上,a i j之前恰有j-1个元素,因此,元素a i j保存在向量sa中时的下标值k之间的对应关系是: k=i?(i-1)/2+j-1 i≧j 若i

以主对角线划分,三角矩阵有上三角和下三角两种。 上三角矩阵的下三角(不包括主对角线)中的元素均为常数c(一般为0)。下三角矩阵正好相反,它的主对角线上方均为常数,如图5-5所示。 三角矩阵中的重复元素c可共享一个存储空间,其余的元素正好有n(n+1)/2个,因此,三角矩阵可压缩存储到向量sa[0…n(n+1)/2]中,其中c存放在向量的第1个分量中。 上三角矩阵元素a i j保存在向量sa中时的下标值k与(i,j)之间的对应关系是:下三角矩阵元素a i j保存在向量sa中时的下标值k与(i,j)之间的对应关系是: 3 对角矩阵 矩阵中,除了主对角线和主对角线上或下方若干条对角线上的元素之外,其余元素皆为零。即所有的非零元素集中在以主对角线为了中心的带状区域中,如图5-6所示。 如上图三对角矩阵,非零元素仅出现在主对角(a i i,1≦i≦n)上、主对角线上的那条对角线(a i i+1,1≦i≦n-1) 、主对角线下的那条对角线上(a i+1 i,1≦i≦n-1)。显然,当| i-j |>1时,元素a ij=0。

稀疏矩阵基本操作实验报告

稀疏矩阵基本操作实验报告 一、实验内容 稀疏矩阵的压缩储存结构,以及稀疏矩阵的三元组表表示方法下的转置、相加、相 乘等算法 二、实验目的 1. 熟悉数组、矩阵的定义和基本操作 2. 熟悉稀疏矩阵的储存方式和基本运算 3. 理解稀疏矩阵的三元组表类型定义,掌握稀疏矩阵的输入、输出和转置算法 三、实验原理 1. 使用三元组储存矩阵中的非零元素(三元组分别储存非零元素的行下标,列下标和 元素值)。除了三元组表本身,储存一个稀疏矩阵还需要额外的三个变量,分别储 存矩阵的非零元个数,矩阵的行数和矩阵的列数。 2. 稀疏矩阵的创建算法: 第一步:根据矩阵创建一个二维数组,表示原始矩阵 第二步:取出二维数组中的元素(从第一个元素开始取),判断取出元素是否为非零元素,如果为非零元素,把该非零元素的数值以及行下标和列下表储存到三元数 组表里,否则取出下一个元素,重复该步骤。 第三步:重复第二步,知道二维数组中所有的元素已经取出。 3. 稀疏矩阵倒置算法:

第一步:判断进行倒置的矩阵是否为空矩阵,如果是,则直接返回错误信息。 第二步:计算要倒置的矩阵每列非零元素的数量,存入到num 数组(其中num[i] 代表矩阵中第i 列非零元素的个数)。以及倒置后矩阵每行首非零元的位置,存入cpot 数组中(其中cpot 表示倒置后矩阵每行非零元的位置,对应表示原矩阵每列中第 一个非零元的位置)。 第三步:确定倒置后矩阵的行数和列数。 第四步:取出表示要导致矩阵中三元组表元素{e, I, j} (第一次取出第一个,依次取出下一个元素),从第二步cpot 数组中确定该元素倒置后存放的位置(cpot[j] ),把该元素的行下标和列下标倒置以后放入新表的指定位置中。cpot[j] 变量加一。 第五步:重复第四步,直到三元组表中所有的元素都完成倒置。 第六步:把完成倒置运算的三元组表输出。 4. 稀疏矩阵加法算法: 第一步:检查相加两个矩阵的行数和列数是否相同,如果相同,则进入第二步,否 则输出错误信息。 第二步:定义变量i 和j,用于控制三元组表的遍历。 第三步:比较变量矩阵M 中第i 个元素和矩阵N 中第j 个元素,如果两个元素是同一行元素,如果不是则进入第四步,如果是,再继续比较两个元素是否为同一列元 素,如果是,把两个元素值相加,放到三元组表中;否则把列下表小的元素依次放 到三元组表中。进入第五步 第四步:如果矩阵M 中第i 个元素的行下标大于矩阵N 中第j 个元素的行下标,则把矩阵N 中第j 个元素所在行的所有非零元素添加到三元组表中;如果矩阵M 中第

第三节矩阵基本函数运算与矩阵元素的提取(第二章)

实验三 第三节矩阵基本函数运算与矩阵元素的提取(第二章)一、矩阵基本函数运算 此运算是矩阵运算中最实用的部分,其基本命令如下: 命令集9 矩阵的大小、行列式、逆、特征值、秩、迹、范数size(A) 给出包含A的维数的一个行向量.在这个返回向量中的第一个元素是行数,随后是列数. [ m,n ]=size(A) 给出A的维数、m行数和n列数,即两个标量. length(x) 给出一个向量的长度,即x分量个数. sum(A) 若A是矩阵,给出一个行向量,其每个分量表示A相应的列和; 若A是向量,给出此向量的分量和. det(A) 求矩阵A的行列式. eig(A) 求包含矩阵A的特征值的向量. [X,D]=eig(A) 求包含矩阵A的特征值对应的对角阵D和以相应特征向 量为列的矩阵. inv(A)或A ^ (-1) 求矩阵A的逆矩阵. rank(A) 求矩阵A的秩. trace(A) 求矩阵A的迹(对角线元素之和). norm(A,1) 矩阵A的1—范数或列和范数,定义如下. norm(A,2) 矩阵A的2—范数. norm(A,inf) 矩阵A的∞—范数. norm(x,1) 向量x的1—范数或列和范数,定义如下. norm(x,2) 向量x的2—范数. norm(x,inf) 向量x的∞—范数.

范数定义如下: 设'12(,, ,)n x x x x =,()ij n m A a ?=,则相应范数定义如下 11 n i i x x ==∑ ;2x = ;max i i x x ∞ = 11 max n ij j i A a ==∑, 1 max n ij i j A a ∞ ==∑ , 2A'A i A λ=,其中为的最大特征值 二、矩阵元素的提取 在MATLAB 中还有利用已存在的矩阵建立新矩阵的命令.以下假设矩阵 A 是m ×n 的矩阵,x 是个有n 个元素的向量. 1. 对角阵与三角阵的生成 命令集10 diag(A) 生成一个由矩阵A 主对角线元素组成的列向量.主对角线总是 从矩阵左上角开始.对于方阵来说它结束于矩阵的右下角. diag(x) 生成一个n 维的方阵,它的主对角线元素值取自向量 x ,其余 元素的值都为0. diag(A , k) 生成一个由矩阵A 第k 条对角线的元素组成的列向量. k= 0为 主对角线;k< 0为下第k 对角线;k> 0为上第k 对角线. diag(x , k) 生成一个(n+ a b s (k) )×(n+ a b s (k) )维的矩阵,该矩阵的第k 条对角线元素取自向量x ,其余元素都为零.关于参数k 可参考 上个命令. triu(A) 生成一个和A 大小相同的上三角矩阵.该矩阵的主对角线及 以上元素取自A 中相应元素,其余元素都为零. triu(A , k) 生成一个和A 大小相同的上三角矩阵.该矩阵的第k 条对角线 及以上元素取自A 中相应元素,其余元素都为零. 命令t r i u ( A , 0 )等同于命令t r i u ( A ).

相关文档