MATLAB矩阵运算(2)

时间:2024-03-04 16:22:56

1.2.14  特殊运算

1.矩阵对角线元素的抽取

函数  diag

格式  X = diag(v,k)   %以向量v的元素作为矩阵X的第k条对角线元素,当k=0时,v为X的主对角线;当k>0时,v为上方第k条对角线;当k<0时,v为下方第k条对角线。

X = diag(v)    %以v为主对角线元素,其余元素为0构成X。

v = diag(X,k)   %抽取X的第k条对角线元素构成向量v。k=0:抽取主对角线元素;k>0:抽取上方第k条对角线元素;k<0抽取下方第k条对角线元素。

v = diag(X)    %抽取主对角线元素构成向量v。

例1-46

>> v=[1 2 3];

>> x=diag(v,-1)

x =

     0     0     0     0

     1     0     0     0

     0     2     0     0

     0     0     3     0

>> A=[1 2 3;4 5 6;7 8 9]

A =

     1     2     3

     4     5     6

     7     8     9

>> v=diag(A,1)

v =

     2

     6

2.上三角阵和下三角阵的抽取

函数  tril   %取下三角部分

格式  L = tril(X)     %抽取X的主对角线的下三角部分构成矩阵L

L = tril(X,k)    %抽取X的第k条对角线的下三角部分;k=0为主对角线;k>0为主对角线以上;k<0为主对角线以下。

函数  triu    %取上三角部分

格式  U = triu(X)    %抽取X的主对角线的上三角部分构成矩阵U

U = triu(X,k)   %抽取X的第k条对角线的上三角部分;k=0为主对角线;k>0为主对角线以上;k<0为主对角线以下。

例1-47

>> A=ones(4)    %产生4阶全1阵

A =

   1     1     1     1

     1     1     1     1

     1     1     1     1

     1     1     1     1

>> L=tril(A,1)    %取下三角部分

L =

     1     1     0     0

     1     1     1     0

     1     1     1     1

     1     1     1     1

>> U=triu(A,-1)    %取上三角部分

U =

     1     1     1     1

     1     1     1     1

     0     1     1     1

     0     0     1     1

3.矩阵的变维

矩阵的变维有两种方法,即用“:”和函数“reshape”,前者主要针对2个已知维数矩阵之间的变维操作;而后者是对于一个矩阵的操作。

(1)“:”变维

例1-48

> A=[1 2 3 4 5 6;6 7 8 9 0 1]

A =

     1     2     3     4     5     6

     6     7     8     9     0     1

>> B=ones(3,4)

B =

     1     1     1     1

     1     1     1     1

     1     1     1     1

>> B(:)=A(:)

B =

     1     7     4     0

     6     3     9     6

     2     8     5     1

(2)Reshape函数变维

格式  B = reshape(A,m,n)       %返回以矩阵A的元素构成的m×n矩阵B

B = reshape(A,m,n,p,…)   %将矩阵A变维为m×n×p×…

B = reshape(A,[m n p…])   %同上

B = reshape(A,siz)        %由siz决定变维的大小,元素个数与A中元素个数

相同。

例1-49  矩阵变维

>> a=[1:12];

>> b=reshape(a,2,6)

b =

     1     3     5     7     9    11

     2     4     6     8    10    12

4.矩阵的变向

(1)矩阵旋转

函数

格式  B = rot90 (A)    %将矩阵A逆时针方向旋转90°

B = rot90 (A,k)   %将矩阵A逆时针方向旋转(k×90°),k可取正负整数。

例1-50

>> A=[1 2 3;4 5 6;7 8 9]

A =

     1     2     3

     4     5     6

     7     8     9

>> Y1=rot90(A),Y2=rot90(A,-1)

Y1 =     %逆时针方向旋转

    3     6     9

    2     5     8

    1     4     7

Y2 =     %顺时针方向旋转

    7     4     1

    8     5     2

    9     6     3

(2)矩阵的左右翻转

函数  fliplr

格式  B = fliplr(A)   %将矩阵A左右翻转

(3)矩阵的上下翻转

函数  flipud

格式  B = flipud(A)   %将矩阵A上下翻转

例1-51

>> A=[1 2 3;4 5 6]

A =

     1     2     3

     4     5     6

>> B1=fliplr(A),B2=flipud(A)

B1 =

    3     2     1

    6     5     4

B2 =

    4     5     6

    1     2     3

(4)按指定维数翻转矩阵

函数  flipdim

格式  B = flipdim(A,dim)    % flipdim(A,1) = flipud(A),并且flipdim(A,2)=fliplr(A)。

例1-52

>> A=[1 2 3;4 5 6]

A =

     1     2     3

     4     5     6

>> B1=flipdim(A,1),B2=flipdim(A,2)

B1 =

    4     5     6

    1     2     3

B2 =

    3     2     1

    6     5     4

(5)复制和平铺矩阵

函数  repmat

格式  B = repmat(A,m,n)       %将矩阵A复制m×n块,即B由m×n块A平铺而成。

B = repmat(A,[m n])      %与上面一致

B = repmat(A,[m n p…])   %B由m×n×p×…个A块平铺而成

repmat(A,m,n)           %当A是一个数a时,该命令产生一个全由a组成的m×n矩阵。

例1-53

>> A=[1 2;5 6]

A =

     1     2

     5     6

>> B=repmat(A,3,4)

B =

     1     2       1     2       1     2       1     2

     5     6       5     6       5     6       5     6

     1     2       1     2       1     2       1     2

     5     6       5     6       5     6       5     6

     1     2       1     2       1     2       1     2

     5     6       5     6       5     6       5     6

5.矩阵的比较关系

矩阵的比较关系是针对于两个矩阵对应元素的,所以在使用关系运算时,首先应该保证两个矩阵的维数一致或其中一个矩阵为标量。关系运算是对两个矩阵的对应运算进行比较,若关系满足,则将结果矩阵中该位置元素置为1,否则置0。

MATLAB的各种比较关系运算有见表1-1。

表1-1

运算符

含义

运算符

含义

大于关系

大于关系

= =

等于关系

>=

大于或等于关系

<=

小于或等于关系

~ =

不等于关系

例1-54

>> A=[1 2 3 4;5 6 7 8];B=[0 2 1 4;0 7 7 2];

>> C1=A==B, C2=A>=B, C3=A~=B

C1 =

    0     1     0     1

    0     0     1     0

C2 =

    1     1     1     1

    1     0     1     1

C3 =

    1     0     1     0

    1     1     0     1

6.矩阵元素的数据变换

对于小数构成的矩阵A来说,如果我们想对它取整数,有以下几种方法:

(1)按-∞方向取整

函数  floor

格式  floor(A)   %将A中元素按-∞方向取整,即取不足整数。

(2)按+∞方向取整

函数  ceil

格式  ceil(A)   %将A中元素按+∞方向取整,即取过剩整数。

(3)四舍五入取整

函数  round

格式  round (A)   %将A中元素按最近的整数取整,即四舍五入取整。

(4)按离0近的方向取整

函数  fix

格式  fix (A)   %将A中元素按离0近的方向取整

例1-55

>> A=-1.5+4*rand(3)

A =

   2.3005    0.4439    0.3259

  -0.5754    2.0652   -1.4260

   0.9274    1.5484    1.7856

>> B1=floor(A),B2=ceil(A),B3=round(A),B4=fix(A)

B1 =

    2     0     0

   -1     2    -2

    0     1     1

B2 =

    3     1     1

    0     3    -1

    1     2     2

B3 =

    2     0     0

   -1     2    -1

    1     2     2

B4 =

    2     0     0

    0     2    -1

    0     1     1

(5)矩阵的有理数形式

函数  rat

格式  [n,d]=rat (A)   %将A表示为两个整数矩阵相除,即A=n./d。

例1-56  对于上例中的A

>> [n,d]=rat(A)

n =

       444          95         131

       -225        2059        -472

       166          48         1491

d =

   193   214   402

   391   997   331

   179    31   835

(6)矩阵元素的余数

函数  rem

格式  C = rem (A, x)   %表示A矩阵除以模数x后的余数。若x=0,则定义rem(A, 0)=NaN,若x≠0,则整数部分由fix(A./x)表示,余数C=A-x.*fix (A./x)。允许模x为小数。

7.矩阵逻辑运算

设矩阵A和B都是m×n矩阵或其中之一为标量,在MATLAB中定义了如下的逻辑运算:

(1)矩阵的与运算

格式  A&B或and(A, B)

说明  A与B对应元素进行与运算,若两个数均非0,则结果元素的值为1,否则为0。

(2)或运算

格式  A|B或or(A, B)

说明  A与B对应元素进行或运算,若两个数均为0,则结果元素的值为0,否则为1。

(3)非运算

格式  ~A或not (A)

说明  若A的元素为0,则结果元素为1,否则为0。

(4)异或运算

格式  xor (A,B)

说明  A与B对应元素进行异或运算,若相应的两个数中一个为0,一个非0,则结果为0,否则为1。

例1-57

>> A=[0 2 3 4;1 3 5 0],B=[1 0 5 3;1 5 0 5]

A =

   0     2     3     4

     1     3     5     0

B =

     1     0     5     3

     1     5     0     5

>> C1=A&B,C2=A|B,C3=~A,C4=xor(A,B)

C1 =

    0     0     1     1

    1     1     0     0

C2 =

    1     1     1     1

    1     1     1     1

C3 =

    1     0     0     0

    0     0     0     1

C4 =

    1     1     0     0

    0     0     1     1

1.2.15  符号矩阵运算

1.符号矩阵的四则运算

Matlab 6.x 抛弃了在4.2版中为符号矩阵设计的复杂函数形式,把符号矩阵的四则运算简化为与数值矩阵完全相同的运算方式,其运算符为:加(+)、减(-)、乘(×)、除(/、\)等或:符号矩阵的和(symadd)、差(symsub)、乘 (symmul)。

例1-58  >>

>> ;

>>C=B-A

>>D=a\b

则显示:

C=

x-1/x  1-1/(x+1)

x+2-1/(x+2)   -1/(x+3)

D=

-6*x-2*x^3-7*x^2     1/2*x^3+x+3/2*x^2

6+2*x^3+10*x^2+14*x   -2*x^2-3/2*x-1/2*x^3

2.其他基本运算

符号矩阵的其他一些基本运算包括转置(\')、行列式(det)、逆(inv)、秩(rank)、幂(^)和指数(exp和expm)等都与数值矩阵相同

3.将数值矩阵转化为符号矩阵

函数  sym

格式  B=sym(A)   %将A转化为符号矩阵B

例1-59 

>> A=[2/3,sqrt(2),0.222;1.4,1/0.23,log(3)]

A =

   0.6667    1.4142    0.2220

   1.4000    4.3478    1.0986

>> B=sym(A)

B =

[  2/3,      sqrt(2),                     111/500]

[   7/5,     100/23,    4947709893870346*2^(-52)]

4.符号矩阵的索引与修改

符号矩阵的索引与修改同数值矩阵的索引与修改完全相同,即用矩阵的坐标括号表达式实现。

例1-60  对上例中的矩阵B

>> B(2,3)      %矩阵的索引

ans =

4947709893870346*2^(-52)

>> B(2,3)=\'log(7)\'     %矩阵的修改

B =

[     2/3, sqrt(2), 111/500]

[     7/5,  100/23,  log(7)]

5.符号矩阵的简化

符号工具箱中提供了符号矩阵因式分解、展开、合并、简化及通分等符号操作函数。

(1)因式分解

函数  factor

格式  factor(s)    %符号表达式s的因式分解函数

说明  S为符号矩阵或符号表达式,常用于多项式的因式分解。

例1-61  将x 9-1分解因式

在Matlab命令窗口键入:

syms x

factor(x^9-1)

则显示:ans =

(x-1)*(x^2+x+1)*(x6+x^3+1)

例1-62  问“入”取何值时,齐次方程组 有非0解?

解:在Matlab编辑器中建立M文件:

syms k

A=[1-k -2 4;2 3-k 1;1 1 1-k];

D=det(A)

factor(D)

其结果显示如下:

D =

-6*k+5*k^2-k^3

ans =

-k*(k-2)*(-3+k)

从而得到:当k=0、k=2或k=3时,原方程组有非0解。

(2)符号矩阵的展开

函数  expand  

格式:expand(s)   %符号表达式s的展开函数

说明:s为符号矩阵或表达式。常用在多项式的因式分解中,也常用于三角函数,指数函数和对数函数的展开中。

例1-63  将(x+1)3、sin(x+y)展开

在Matlab编辑器中建立M文件:

syms  x  y

p=expand((x+1)^3)

q=expand(sin(x+y))

则结果显示为

p =

    x^3+3*x^2+3*x+1

q =

sin(x)*cos(y)+cos(x)*sin(y)

(3)同类式合并

函数  Collect

格式  Collect(s,v)   %将s中的变量v的同幂项系数合并

Collect(s)    % s是矩阵或表达式,此命令对由命令findsym函数返回的默认变量进行同类项合并。

(4)符号简化

函数  simple或simplify   %寻找符号矩阵或符号表达式的最简型

格式  simple (s)          % s是矩阵或表达式

      [R,how]=simple (s)  %R为返回的最简形,how为简化过程中使用的主要方法。

说明  Simple(s)将表达式s的长度化到最短。若还想让表达式更加精美,可使用函数Pretty。

格式  Pretty(s)     %使表达式s更加精美

例1-64  计算行列式 的值。

在Matlab编辑器中建立M文件:

syms  a  b  c  d

A=[1 1 1 1;a b c d;a^2 b^2 c^2 d^2;a^4 b^4 c^4 d^4];

d1=det(A)

d2=simple(d1)     %化简表达式d1

pretty(d2)      %让表达式d2符合人们的书写习惯

则显示结果如下:

d1 =

b*c^2*d^4-b*d^2*c^4-b^2*c*d^4+b^2*d*c^4+b^4*c*d^2-b^4*d*c^2-a*c^2*d^4+a*d^2*c^4+a*b^2*d^4-a*b^2*c^4-a*b^4*d^2+a*b^4*c^2+a^2*c*d^4-a^2*d*c^4-a^2*b*d^4+a^2*b*c^4+a^2*b^4*d-a^2*b^4*c-a^4*c*d^2+a^4*d*c^2+a^4*b*d^2-a^4*b*c^2-a^4*b^2*d+a^4*b^2*c

d2 =

(-d+c)*(b-d)*(b-c)*(-d+a)*(a-c)*(a-b)*(a+c+d+b)

(-d+c)(b-d)(b-c)(-d+a)(a-c)(a-b)(a+c+d+b)

1.2.16  矩阵元素个数的确定

函数  numel

格式  n = numel(a)    %计算矩阵A中元素的个数

例1-65

>> A=[1 2 3 4;5 6 7 8];

>> n=numel(A)

n =

     8

                                                                                                                                                        1.3  矩阵分解

1.3.1  Cholesky分解

函数  chol

格式  R = chol(X)      %如果X为n阶对称正定矩阵,则存在一个实的非奇异上三角阵R,满足R\'*R = X;若X非正定,则产生错误信息。

[R,p] = chol(X)   %不产生任何错误信息,若X为正定阵,则p=0,R与上相同;若X非正定,则p为正整数,R是有序的上三角阵。

例1-66 

>> X=pascal(4)    %产生4阶pascal矩阵

X =

     1     1     1     1

     1     2     3     4

     1     3     6    10

     1     4    10    20

>> [R,p]=chol(X)

R =

     1     1     1     1

     0     1     2     3

     0     0     1     3

     0     0     0     1

p =

     0

1.3.2  LU分解

矩阵的三角分解又称LU分解,它的目的是将一个矩阵分解成一个下三角矩阵L和一个上三角矩阵U的乘积,即A=LU。

函数  lu

格式  [L,U] = lu(X)     %U为上三角阵,L为下三角阵或其变换形式,满足LU=X。

[L,U,P] = lu(X)   %U为上三角阵,L为下三角阵,P为单位矩阵的行变换矩阵,满足LU=PX。

例1-67

>> A=[1 2 3;4 5 6;7 8 9];

>> [L,U]=lu(A)

L =

   0.1429    1.0000         0

   0.5714    0.5000    1.0000

   1.0000         0         0

U =

   7.0000    8.0000    9.0000

        0    0.8571    1.7143

        0         0    0.0000

>> [L,U,P]=lu(A)

L =

   1.0000         0         0

   0.1429    1.0000         0

   0.5714    0.5000    1.0000

U =

   7.0000    8.0000    9.0000

        0    0.8571    1.7143

        0         0    0.0000

P =

    0     0     1

    1     0     0

    0     1     0

1.3.3  QR分解

将矩阵A分解成一个正交矩阵与一个上三角矩阵的乘积。

函数  qr

格式  [Q,R] = qr(A)     %求得正交矩阵Q和上三角阵R,Q和R满足A=QR。

[Q,R,E] = qr(A)   %求得正交矩阵Q和上三角阵R,E为单位矩阵的变换形式,R的对角线元素按大小降序排列,满足AE=QR。

[Q,R] = qr(A,0)    %产生矩阵A的“经济大小”分解

[Q,R,E] = qr(A,0)  %E的作用是使得R的对角线元素降序,且Q*R=A(:, E)。

R = qr(A)         %稀疏矩阵A的分解,只产生一个上三角阵R,满足R\'*R = A\'*A,这种方法计算A\'*A时减少了内在数字信息的损耗。

[C,R] = qr(A,b)    %用于稀疏最小二乘问题:minimize||Ax-b||的两步解:[C,R] = qr(A,b),x = R\c。

R = qr(A,0)       %针对稀疏矩阵A的经济型分解

[C,R] = qr(A,b,0)   %针对稀疏最小二乘问题的经济型分解

例1-68 

>>A =[ 1  2  3;4  5  6; 7  8  9; 10  11  12];

>>[Q,R] = qr(A)

Q =

   -0.0776    -0.8331     0.5444     0.0605

   -0.3105    -0.4512    -0.7709     0.3251

   -0.5433    -0.0694    -0.0913    -0.8317

   -0.7762     0.3124     0.3178     0.4461

R =

   -12.8841    -14.5916    -16.2992

          0     -1.0413     -2.0826

          0           0      0.0000

          0           0           0

函数  qrdelete

格式  [Q,R] = qrdelete(Q,R,j)   %返回将矩阵A的第j列移去后的新矩阵的qr分解

例1-69

>> A=[-149 -50 -154;537 180 546;-27 -9 -25];

>> [Q,R]=qr(A)

Q =

   -0.2671   -0.7088    0.6529

    0.9625   -0.1621    0.2176

   -0.0484    0.6865    0.7255

R =

  557.9418  187.0321  567.8424

         0    0.0741    3.4577

         0         0    0.1451

>> [Q,R]=qrdelete(Q,R,3)    %将A的第3列去掉后进行qr分解。

Q =

 -0.2671   -0.7088    0.6529

    0.9625   -0.1621    0.2176

   -0.0484    0.6865    0.7255

R =

  557.9418  187.0321

         0    0.0741

         0         0

函数  qrinsert

格式  [Q,R] = qrinsert(Q,R,j,x)   %在矩阵A中第j列插入向量x后的新矩阵进行qr分解。若j大于A的列数,表示在A的最后插入列x。

例1-70

>> A=[-149 -50 -154;537 180 546;-27 -9 -25];

>> x=[35 10 7]\';

>> [Q,R]=qrinsert(Q,R,4,x)

Q =

   -0.2671   -0.7088    0.6529

    0.9625   -0.1621    0.2176

   -0.0484    0.6865    0.7255

R =

  557.9418  187.0321  567.8424   -0.0609

         0    0.0741    3.4577  -21.6229

         0         0    0.1451   30.1073

1.3.4  Schur分解

函数  schur

格式  T = schur(A)      %产生schur矩阵T,即T的主对角线元素为特征值的三角阵。

T = schur(A,flag)   %若A有复特征根,则flag=\'complex\',否则flag=\'real\'。

[U,T] = schur(A,…)   %返回正交矩阵U和schur矩阵T,满足A = U*T*U\'。

例1-71 

>> H = [ -149  -50  -154; 537  180  546; -27  -9  -25 ];

>> [U,T]=schur(H)

U =

    0.3162   -0.6529    0.6882

   -0.9487   -0.2176    0.2294

    0.0000    0.7255    0.6882

T =

    1.0000   -7.1119 -815.8706

         0    2.0000  -55.0236

         0         0    3.0000

1.3.5  实Schur分解转化成复Schur分解

函数  rsf2csf

格式  [U,T] = rsf2csf (U,T)   %将实舒尔形式转化成复舒尔形式

例1-72 

>> A=[1 1 1 3;1 2 1 1;1 1 3 1;-2 1 1 4];

>> [u,t]=schur (A)

u =

   -0.4916   -0.4900   -0.6331   -0.3428

   -0.4980    0.2403   -0.2325    0.8001

   -0.6751    0.4288    0.4230   -0.4260

   -0.2337   -0.7200    0.6052    0.2466

t =

    4.8121    1.1972   -2.2273   -1.0067

         0    1.9202   -3.0485   -1.8381

         0    0.7129    1.9202    0.2566

         0         0         0    1.3474

>> [U,T]=rsf2csf (u,t)

U =

  -0.4916            -0.2756 - 0.4411i   0.2133 + 0.5699i  -0.3428         

  -0.4980            -0.1012 + 0.2163i  -0.1046 + 0.2093i   0.8001         

  -0.6751             0.1842 + 0.3860i  -0.1867 - 0.3808i  -0.4260         

  -0.2337             0.2635 - 0.6481i   0.3134 - 0.5448i   0.2466         

T =

   4.8121            -0.9697 + 1.0778i  -0.5212 + 2.0051i  -1.0067         

        0             1.9202 + 1.4742i   2.3355             0.1117 + 1.6547i

        0                  0             1.9202 - 1.4742i   0.8002 + 0.2310i

        0                  0                  0             1.3474         

1.3.6  特征值分解

函数  eig

格式  d = eig(A)         %求矩阵A的特征值d,以向量形式存放d。

d = eig(A,B)       %A、B为方阵,求广义特征值d,以向量形式存放d。

[V,D] = eig(A)      %计算A的特征值对角阵D和特征向量V,使AV=VD成立。

[V,D] = eig(A,\'nobalance\')   %当矩阵A中有与截断误差数量级相差不远的值时,该指令可能更精确。\'nobalance\'起误差调节作用。

[V,D] = eig(A,B)    %计算广义特征值向量阵V和广义特征值阵D,满足AV=BVD。

[V,D] = eig(A,B,flag)   % 由flag指定算法计算特征值D和特征向量V,flag的可能值为:\'chol\' 表示对B使用Cholesky分解算法,这里A为对称Hermitian矩阵,B为正定阵。\'qz\' 表示使用QZ算法,这里A、B为非对称或非Hermitian矩阵。

说明  一般特征值问题是求解方程: 解的问题。广义特征值问题是求方程: 解的问题。

1.3.7  奇异值分解

函数  svd

格式  s = svd (X)          %返回矩阵X的奇异值向量

[U,S,V] = svd (X)    %返回一个与X同大小的对角矩阵S,两个酉矩阵U和V,且满足= U*S*V\'。若A为m×n阵,则U为m×m阵,V为n×n阵。奇异值在S的对角线上,非负且按降序排列。

[U,S,V] = svd (X,0)   %得到一个“有效大小”的分解,只计算出矩阵U的前n列,矩阵S的大小为n×n。

例1-73

>> A=[1 2;3 4;5 6;7 8];

>> [U,S,V]=svd(A)

U =

   -0.1525   -0.8226   -0.3945   -0.3800

   -0.3499   -0.4214    0.2428    0.8007

   -0.5474   -0.0201    0.6979   -0.4614

   -0.7448    0.3812   -0.5462    0.0407

S =

   14.2691         0

         0    0.6268

         0         0

         0         0

V =

   -0.6414    0.7672

   -0.7672   -0.6414

>> [U,S,V]=svd(A,0)

U =

   -0.1525   -0.8226

   -0.3499   -0.4214

   -0.5474   -0.0201

   -0.7448    0.3812

S =

   14.2691         0

         0    0.6268

V =

   -0.6414    0.7672

   -0.7672   -0.6414

1.3.8  广义奇异值分解

函数  gsvd

格式  [U,V,X,C,S] = gsvd(A,B)   %返回酉矩阵U和V、一个普通方阵X、非负对角矩阵C和S,满足A = U*C*X\',B = V*S*X\',C\'*C + S\'*S = I (I为单位矩阵);A和B的列数必须相同,行数可以不同。

[U,V,X,C,S] = gsvd(A,B,0)   %含义与前面相似

sigma = gsvd (A,B)         %返回广义奇异值sigma

例1-74

>> A=reshape(1:12,3,4)    %产生3行4列矩阵,元素由1,2,…,12构成。

A =

  1     4     7    10

    2     5     8    11

    3     6     9    12

>> B=magic(4)   %产生4阶魔方阵

B =

    16     2     3    13

     5    11    10     8

     9     7     6    12

     4    14    15     1

>> [U,V,X,C,S]=gsvd(A,B)

U =

    0.4082    0.7071    0.5774

   -0.8165    0.0000    0.5774

    0.4082   -0.7071    0.5774

V =

    0.2607   -0.7950   -0.5000    0.2236

   -0.4029    0.3710   -0.5000    0.6708

   -0.5452   -0.0530   -0.5000   -0.6708

    0.6874    0.4770   -0.5000   -0.2236

X =

         0   -9.4340  -17.0587    3.4641

    1.8962    8.7980  -17.0587    8.6603

    3.7924    8.1620  -17.0587   13.8564

   -5.6885   -7.5260  -17.0587   19.0526

C =

         0    0.0000         0         0

         0         0    0.0829         0

         0         0         0    1.0000

S =

    1.0000         0         0         0

         0    1.0000         0         0

         0         0    0.9966         0

         0         0         0    0.0000