日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SVD分解的并行实现

發(fā)布時(shí)間:2025/7/25 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SVD分解的并行实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在之前的文章中,我對SVD進(jìn)行了大致的了解,它在互聯(lián)網(wǎng)高端領(lǐng)域中有廣泛的應(yīng)用,至于它的一些詳細(xì)應(yīng)

用以后再進(jìn)一步學(xué)習(xí)。現(xiàn)在主要的問題是如何有效地實(shí)現(xiàn)SVD分解,接下來我會先用兩種方法來實(shí)現(xiàn)SVD分

解,即基于雙邊Jacobi旋轉(zhuǎn)的SVD基于單邊Jacobi旋轉(zhuǎn)的SVD

?

這兩種方法重點(diǎn)參考中國知網(wǎng)上的一篇論文:《并行JACOBI方法求解矩陣奇異值的研究》

?

代碼:

[cpp]?view plaincopy
  • #include?<string.h>??
  • #include?<stdio.h>??
  • #include?<math.h>??
  • #include?<map>??
  • ???
  • #include?"matrix.h"??
  • ???
  • using?namespace?std;??
  • ???
  • const?double?EPS?=?1e-8;??
  • const?int?ITER_NUM?=?30;??
  • ???
  • int?sign(double?x)??
  • {??
  • ????if(x?<?0)?return?-1;??
  • ????return?1;??
  • }??
  • ???
  • void?rotate(Matrix<double>?&matrix,?int?i,?int?j,?bool?&pass,?Matrix<double>?&J)??
  • {??
  • ????double?ele?=?matrix.get(i,?j);??
  • ????if(fabs(ele)?<?EPS)?return;??
  • ???
  • ????pass?=?false;??
  • ????double?ele1?=?matrix.get(i,?i);??
  • ????double?ele2?=?matrix.get(j,?j);??
  • ????double?tao?=?(ele1?-?ele2)?/?(2?*?ele);??
  • ????double?tan?=?sign(tao)?/?(fabs(tao)?+?sqrt(1?+?pow(tao,?2)));??
  • ????double?cos?=?1?/?sqrt(1?+?pow(tan,?2));??
  • ????double?sin?=?cos?*?tan;??
  • ???
  • ????int?size?=?matrix.getRows();??
  • ????Matrix<double>G(IdentityMatrix<double>(size,?size));??
  • ????G.put(i,?i,?cos);??
  • ????G.put(i,?j,?-1?*?sin);??
  • ????G.put(j,?i,?sin);??
  • ????G.put(j,?j,?cos);??
  • ???
  • ????matrix?=?G.getTranspose()?*?matrix?*?G;??
  • ????J?*=?G;??
  • }??
  • ???
  • void?jacobi(Matrix<double>?&matrix,?int?size,?vector<double>?&E,?Matrix<double>?&J)??
  • {??
  • ????int?iter_num?=?ITER_NUM;??
  • ????while(iter_num--?>?0)??
  • ????{??
  • ????????bool?pass?=?true;??
  • ????????for(int?i?=?0;?i?<?size;?i++)??
  • ????????{??
  • ????????????for(int?j?=?i?+?1;?j?<?size;?j++)??
  • ????????????????rotate(matrix,?i,?j,?pass,?J);??
  • ????????}??
  • ????????if(pass)?break;??
  • ????}??
  • ????cout?<<?"迭代次數(shù):"?<<?ITER_NUM?-?iter_num?<<?endl;??
  • ???
  • ????for(int?i?=?0;?i?<?size;?i++)??
  • ????{??
  • ????????E[i]?=?matrix.get(i,?i);??
  • ????????if(E[i]?<?EPS)??
  • ????????????E[i]?=?0.0;??
  • ????}??
  • }??
  • ???
  • void?svd(Matrix<double>?&A,?Matrix<double>?&U,?Matrix<double>?&V,?vector<double>?&E)??
  • {??
  • ????int?rows?=?A.getRows();??
  • ????int?columns?=?A.getColumns();??
  • ????assert(rows?<=?columns);??
  • ????assert(U.getRows()?==?rows);??
  • ????assert(U.getColumns()?==?rows);??
  • ????assert(V.getRows()?==?columns);??
  • ????assert(V.getColumns()?==?columns);??
  • ????assert(E.size()?==?columns);??
  • ???
  • ????Matrix<double>?B?=?A.getTranspose()?*?A;??
  • ????Matrix<double>?J(IdentityMatrix<double>(columns,?columns));??
  • ????vector<double>?S(columns);??
  • ????jacobi(B,?columns,?S,?J);??
  • ????for(int?i?=?0;?i?<?S.size();?i++)??
  • ????????S[i]?=?sqrt(S[i]);??
  • ???
  • ????multimap<double,?int>?eigen;??
  • ????for(int?i?=?0;?i?<?S.size();?i++)??
  • ????????eigen.insert(make_pair(S[i],?i));??
  • ????multimap<double,?int>::const_iterator?iter?=?--eigen.end();??
  • ????int?num_eig?=?0;??
  • ????for(int?i?=?0;?i?<?columns;?i++,?iter--)??
  • ????{??
  • ????????int?index?=?iter->second;??
  • ????????E[i]?=?S[index];??
  • ????????if(E[i]?>?EPS)??
  • ????????????num_eig++;??
  • ????????for(int?row?=?0;?row?<?columns;?row++)??
  • ????????????V.put(row,?i,?J.get(row,?index));??
  • ????}??
  • ???
  • ????assert(num_eig?<=?rows);??
  • ????for(int?i?=?0;?i?<?num_eig;?i++)??
  • ????{??
  • ????????Matrix<double>?vi?=?V.getColumn(i);??
  • ????????double?sigma?=?E[i];??
  • ????????Matrix<double>?ui(rows,?1);??
  • ????????ui?=?A?*?vi;??
  • ????????for(int?j?=?0;?j?<?rows;?j++)??
  • ????????????U.put(j,?i,?ui.get(j,?0)?/?sigma);??
  • ????}??
  • }??
  • ???
  • int?main()??
  • {??
  • ????const?int?ROW?=?4;??
  • ????const?int?COL?=?5;??
  • ????assert(ROW?<=?COL);??
  • ????double?arr[ROW?*?COL]?=??
  • ????{1,?0,?0,?0,?2,??
  • ?????0,?0,?3,?0,?0,??
  • ?????0,?0,?0,?0,?0,??
  • ?????0,?4,?0,?0,?0??
  • ?????};??
  • ????Matrix<double>?A(ROW,?COL);??
  • ????A?=?arr;??
  • ???
  • ????Matrix<double>?U(ROW,?ROW);??
  • ????Matrix<double>?V(COL,?COL);??
  • ????vector<double>?E(COL);??
  • ???
  • ????svd(A,?U,?V,?E);??
  • ????Matrix<double>?Sigma(ROW,?COL);??
  • ????for(int?i?=?0;?i?<?ROW;?i++)??
  • ????????Sigma.put(i,?i,?E[i]);??
  • ???
  • ????cout?<<?"U?=?"?<<?endl?<<?U;??
  • ????cout?<<?"Sigma?=?"?<<?endl?<<?Sigma;??
  • ????cout?<<?"V^T?=?"?<<?endl?<<?V.getTranspose();??
  • ???
  • ????Matrix<double>?AA?=?U?*?Sigma?*?V.getTranspose();??
  • ????cout?<<?"Result?AA?=?"?<<?endl?<<?AA;??
  • ???
  • ????return?0;??
  • }??

  • ?

    供參考文章:http://www.cnblogs.com/zhangchaoyang/articles/2575948.html

    總結(jié)

    以上是生活随笔為你收集整理的SVD分解的并行实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。