24小时热门版块排行榜    

Znn3bq.jpeg
汕头大学海洋科学接受调剂
查看: 3018  |  回复: 15
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

长路漫漫

新虫 (初入文坛)

[求助] Fortran 求解复数矩阵SVD时,用到cgesvd,结果与matlab不同,为什么?

RT,很小的一个测试矩阵,代码如下
      integer M,N,MN,Mmax, Nmax,p, nu, nv
         parameter  (M=6,N=4,MN=min(M,N))
          complex :: A(M,N),AA(M,N)
          character , parameter :: job = 'A'
          real                    S(MN)
        complex  :: U(M,M), VT(N,N), V(N,N)
        complex  :: work(1000)
        real  :: rwork(1000)
          integer    info,rw,cl,lwork,kk,i,j,k
         do rw=1,M
             do cl=1,N
                 A(rw,cl)=cmplx(rw,2*cl)
             enddo
          enddo
          lwork=MAX(1,2*MIN(M,N)+MAX(M,N))
       call CGESVD( JOB, JOB, M, N, A, M, S, U, M, VT, N,   &
      &                  WORK, LWORK, RWORK, INFO )
        V=transpose(conjg(VT))  
        aa=u*s*v'
得到的u,v只有前2 列与matlab相同,而后面几列的差距很大,S的结果两边差异非常小,基本一致。
而矩阵aa与原始的一样。有大神可告知原因么?

[ Last edited by 长路漫漫 on 2013-6-26 at 11:09 ]
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

长路漫漫

新虫 (初入文坛)

引用回帖:
4楼: Originally posted by 长路漫漫 at 2013-06-27 11:20:53
谢谢,非常有帮助,只是,我的矩阵很小,而且对精度要求也没有那么高,给你看看一个4×3的复数矩阵得到的两种结果
矩阵A
M=4;
N=3;
for ii=1:M
for jj=1:N
a(ii,jj)=ii+i*2*jj;
end
end
matlab:

u = ...

这里有些写错了,现在进行修正
做的矩阵式6×4的,
M=6;
N=4;
for ii=1:M
for jj=1:N
a(ii,jj)=ii+i*2*jj;
end
end

出了点bug~
5楼2013-06-27 15:34:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 16 个回答

somomo91

专家顾问 (职业作家)

【答案】应助回帖

★ ★ ★ ★
感谢参与,应助指数 +1
jjdg: 金币+1, 感谢参与 2013-06-27 00:31:32
长路漫漫: 金币+3, ★★★很有帮助 2013-06-27 10:22:44
这个问题几乎是公认的
MATLAB 虽然调用 CGESVD,但是它对输入参数进行了预处理,
并且因为编译器的不同,数据精度处理也不大相同,
因此导致两个结果不大相同,
2楼2013-06-26 21:02:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

somomo91

专家顾问 (职业作家)

【答案】应助回帖


jjdg: 金币+1, 感谢参与 2013-06-27 00:31:39
具体的讨论,见LAPACK官方论坛:
http://icl.cs.utk.edu/lapack-for ... ?f=2&t=1689

当然还有其他地方,都说过类似的问题的
3楼2013-06-26 21:03:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

长路漫漫

新虫 (初入文坛)

引用回帖:
3楼: Originally posted by somomo91 at 2013-06-26 21:03:55
具体的讨论,见LAPACK官方论坛:
http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=2&t=1689

当然还有其他地方,都说过类似的问题的

谢谢,非常有帮助,只是,我的矩阵很小,而且对精度要求也没有那么高,给你看看一个4×3的复数矩阵得到的两种结果
矩阵A
M=4;
N=3;
for ii=1:M
for jj=1:N
a(ii,jj)=ii+i*2*jj;
end
end
matlab:

u =

  Columns 1 through 4

  -0.2028 - 0.2666i   0.5235 + 0.3708i   0.4803 + 0.0812i   0.3898 - 0.1821i
  -0.2559 - 0.2442i   0.3188 + 0.2616i  -0.4234 - 0.1552i  -0.3399 + 0.2662i
  -0.3091 - 0.2217i   0.1142 + 0.1524i  -0.3466 + 0.1235i   0.0841 - 0.0690i
  -0.3622 - 0.1993i  -0.0905 + 0.0432i   0.3628 - 0.0013i  -0.5831 + 0.1887i
  -0.4153 - 0.1768i  -0.2952 - 0.0660i  -0.3939 - 0.1528i   0.3245 - 0.3249i
  -0.4684 - 0.1544i  -0.4998 - 0.1753i   0.3208 + 0.1047i   0.1246 + 0.1211i

  Columns 5 through 6

   0.0100 - 0.1874i  -0.0737 + 0.1148i
   0.0538 - 0.3784i   0.2691 - 0.3108i
  -0.1977 + 0.7171i   0.2468 + 0.2400i
   0.0048 + 0.2312i  -0.5080 - 0.0163i
   0.3183 - 0.1634i  -0.4324 - 0.0181i
  -0.1892 - 0.2192i   0.4982 - 0.0096i

s =

   32.8054         0         0         0
         0    2.7938         0         0
         0         0    0.0000         0
         0         0         0    0.0000
         0         0         0         0
         0         0         0         0


v =

  -0.3202                      -0.7730             0.2225             0.5005         
  -0.3972 + 0.1228i  -0.3530 - 0.0509i  -0.1119 - 0.3241i  -0.7494 + 0.1441i
  -0.4742 + 0.2455i   0.0671 - 0.1017i  -0.4436 + 0.6482i  -0.0026 - 0.2882i
  -0.5512 + 0.3683i   0.4871 - 0.1526i   0.3331 - 0.3241i   0.2515 + 0.1441i

zegsvd结果:

u=
(-0.202824375016695,-0.266642178187997) (-0.255949364969120,-0.244187270428356)
(-0.309074354921545,-0.221732362668715) (-0.362199344873970,-0.199277454909075)
(-0.415324334826394,-0.176822547149434) (-0.468449324778819,-0.154367639389794)

(0.523495728897005,0.370844937064488) (0.318833666239141,0.261621268331258)
(0.114171603581277,0.152397599598028)
(-9.049045907658722E-002,4.317393086479759E-002)
(-0.295152521734451,-6.604973786843274E-002)
(-0.499814584392315,-0.175273406601663)

(-0.340495458990843,0.541393498514851) (0.337828171542821,-0.540655966822066)
(0.160806639553680,-0.275424645436289)
(4.866929136520519E-002,7.466583397862278E-002)
(-0.228593892608515,0.132598643065634)
(2.178524913765310E-002,6.742263669924775E-002)

(-0.213595095465232,1.770559300328978E-002)
(-8.118515338632207E-002,-0.101568035512989)
(0.142978695055282,-2.696899503189933E-002)
(0.159236069089761,0.159954322471254)
(0.645307867526083,7.874251718869874E-002)
(-0.652742382819571,-0.127865402118354)

(0.101959655905054,7.515513816888129E-002)
(0.385377896491782,-6.292538458577177E-002)
(-0.389645765970497,-8.452303330092807E-002)
(-0.660124183763325,0.118679170354774) (0.437875799945744,-0.107863393308084)
(0.124556597391242,6.147750267112817E-002)

(-5.714988270508767E-002,4.358750066103587E-002)
(0.164737090936639,-0.319067431094656) (-0.215932231409642,0.700403583527349)
(9.841764078738405E-002,-0.548295272551258)
(7.776246243304019E-002,5.371201559391532E-002)
(-6.783508004233359E-002,6.965960386361419E-002)



s=
32.8054068874654     
   2.79379293216862     
  9.854419884063358E-016
  6.434838164926571E-016


v=
(-0.320194781107884,0.000000000000000E+000)
(-0.397196078916262,0.122773730945919) (-0.474197376724640,0.245547461891838)
(-0.551198674533019,0.368321192837758)

(-0.772965265811650,0.000000000000000E+000)
(-0.352952325959982,-5.085805228873791E-002)
(6.706061389168552E-002,-0.101716104577475)
(0.487073553743353,-0.152574156866213)

(-0.282895611404907,0.000000000000000E+000)
(0.402086157056524,-0.348691818157092)
(4.451452010167405E-002,0.697383636314183)
(-0.163705065753291,-0.348691818157091)

(-0.469009672659151,0.000000000000000E+000)
(0.610331955712300,0.210322709402046) (0.186365106552852,-0.420645418804091)
(-0.327687389606002,0.210322709402045)

很明显可发现s基本一致,而u和s从第三列开始就区别非常大,跟你
具体的讨论,见LAPACK官方论坛:
http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=2&t=1689
讨论的内容还挺不一样的,我之前实验过DGESVD这个,处理实数矩阵时,对于一般精度的矩阵,U,S,V结果基本差不多,误差非常小了,而这个CGESVD和ZESVD处理复数矩阵,误差非常大,就LAPACK官方论坛上,也没有搜索到与CGESVD和ZESVD处理复数矩阵的类似帖子
为这个问题纠结了很久,麻烦大神进一步解答哈,谢谢~~
4楼2013-06-27 11:20:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 山东省基金2026 +7 jerry681 2026-04-08 9/450 2026-04-14 22:01 by 阿勇的篮球
[考研] 297工科调剂? +13 河南农业大学-能 2026-04-13 13/650 2026-04-14 16:46 by Art1977
[考研] 化学070300 求调剂 +23 哈哈哈^_^ 2026-04-12 23/1150 2026-04-14 16:30 by zhouxiaoyu
[考研] 300分求调剂 (085501机械专硕,本科扬大) +9 xu@841019 2026-04-11 10/500 2026-04-14 08:48 by 木木mumu~
[考研] 求调剂,262机械专硕 +8 嗯yyl 2026-04-08 8/400 2026-04-12 02:31 by 秋豆菜芽
[考研] 359求调剂 +5 胃痉挛累了 2026-04-11 5/250 2026-04-11 19:55 by lbsjt
[考研] 085400 328分 求调剂 +10 喂你一个大橙子 2026-04-09 14/700 2026-04-11 19:53 by lqspecial
[考研] 288求调剂 +15 代fish 2026-04-09 16/800 2026-04-11 10:26 by wwj2530616
[考研] 22408 327分求调剂 +4 韵风kon 2026-04-10 4/200 2026-04-11 09:51 by 猪会飞
[考研] 281求调剂 +11 觉得好的吧 2026-04-10 11/550 2026-04-11 09:35 by 逆水乘风
[考研] 一志愿东北大学控制工程085406数二英二385,求调剂 +8 Ezra_Zhang 2026-04-09 8/400 2026-04-11 09:15 by 猪会飞
[考研] 284求调剂 +12 archer.. 2026-04-10 13/650 2026-04-11 08:44 by zhq0425
[考研] 289 分105500药学专硕求调剂(找B区学校) +6 白云123456789 2026-04-09 8/400 2026-04-10 21:13 by zhouxiaoyu
[考研] 314求调剂 +18 xhhdjdjsjks 2026-04-09 19/950 2026-04-10 18:53 by HPUCZ
[考研] 一志愿矿大,材料工程专硕314分,0856可调都可以 +15 无懈可击的巨人 2026-04-09 15/750 2026-04-10 18:10 by hmn_wj
[考研] 青岛科技大学材料学院,环境学院调剂补录4月10日以前都可以 +3 1青科大。 2026-04-09 5/250 2026-04-10 09:58 by 翩翩一书生
[考研] 材料专硕初试分332一志愿西北工业大学, +12 故人?? 2026-04-09 12/600 2026-04-09 18:34 by Ccclqqq
[考研] 085501机械英二77总分294求调剂,接受跨专业学习 +6 守法公民亓纪 2026-04-08 6/300 2026-04-09 15:55 by wp06
[考研] 086000生物与医药调剂 +7 awwwwwooooo 2026-04-09 7/350 2026-04-09 13:31 by 北极159263
[考研] 0860004 求调剂 309分 +6 Yin DY 2026-04-09 6/300 2026-04-09 10:19 by 啊李999
信息提示
请填处理意见