├── main.pdf ├── assets ├── CODE.pdf └── logo.png ├── sections ├── appendix.tex ├── first_page.tex ├── preamble.tex ├── biblography.tex ├── summary.tex ├── direct_solution.tex ├── iterative_solution.tex ├── numeric_examples.tex └── introduction.tex ├── fonts ├── XB-Niloofar.ttf ├── XB-NiloofarBd.ttf ├── XB-NiloofarBdIt.ttf └── XB-NiloofarIt.ttf ├── main.tex ├── README.md └── CODE.ipynb /main.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parvvaresh/golub-kahan/main/main.pdf -------------------------------------------------------------------------------- /assets/CODE.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parvvaresh/golub-kahan/main/assets/CODE.pdf -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parvvaresh/golub-kahan/main/assets/logo.png -------------------------------------------------------------------------------- /sections/appendix.tex: -------------------------------------------------------------------------------- 1 | \section{پیوست} 2 | 3 | \includepdf[pages=-]{assets/CODE.pdf} -------------------------------------------------------------------------------- /fonts/XB-Niloofar.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parvvaresh/golub-kahan/main/fonts/XB-Niloofar.ttf -------------------------------------------------------------------------------- /fonts/XB-NiloofarBd.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parvvaresh/golub-kahan/main/fonts/XB-NiloofarBd.ttf -------------------------------------------------------------------------------- /fonts/XB-NiloofarBdIt.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parvvaresh/golub-kahan/main/fonts/XB-NiloofarBdIt.ttf -------------------------------------------------------------------------------- /fonts/XB-NiloofarIt.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parvvaresh/golub-kahan/main/fonts/XB-NiloofarIt.ttf -------------------------------------------------------------------------------- /main.tex: -------------------------------------------------------------------------------- 1 | \input{sections/preamble.tex} 2 | 3 | \begin{document} 4 | 5 | \input{sections/first_page.tex} 6 | \pagebreak 7 | \input{sections/summary.tex} 8 | \pagebreak 9 | \input{sections/introduction.tex} 10 | \input{sections/direct_solution.tex} 11 | \pagebreak 12 | \input{sections/iterative_solution.tex} 13 | \pagebreak 14 | \input{sections/numeric_examples.tex} 15 | \pagebreak 16 | \input{sections/appendix.tex} 17 | \pagebreak 18 | \input{sections/biblography.tex} 19 | 20 | \end{document} 21 | -------------------------------------------------------------------------------- /sections/first_page.tex: -------------------------------------------------------------------------------- 1 | 2 | \begin{figure}[t] 3 | \centering 4 | \includegraphics[width=0.6\linewidth]{assets/logo.png} 5 | \end{figure} 6 | 7 | \begin{center} 8 | 9 | \textbf{\huge{ دانشگاه صنعتی امیرکبیر }} 10 | \\ 11 | 12 | \textbf{\large{ (پلی تکنیک تهران) }} 13 | \\[30pt] 14 | 15 | \Large{ دانشکده ریاضی و علوم کامپیوتر } 16 | \\ 17 | {\large استاد درس: دکتر مهدی دهقان} 18 | \\ 19 | بهار ۱۴۰۳ 20 | \\[30pt] 21 | 22 | \textbf{\Huge الگوریتم گالوپ کاهان } 23 | \\[50pt] 24 | 25 | \end{center} 26 | علیرضا پرورش 27 | \hfill 28 | ۹۹۱۲۰۱۳ 29 | 30 | \hfill 31 | جبر خطی عددی 32 | \rule[0pt]{\linewidth}{1pt} 33 | 34 | \pagebreak 35 | 36 | \tableofcontents 37 | 38 | -------------------------------------------------------------------------------- /sections/preamble.tex: -------------------------------------------------------------------------------- 1 | \documentclass{article} 2 | 3 | \usepackage{graphicx} 4 | \usepackage{amsfonts} 5 | \usepackage{amsmath} 6 | \usepackage{amsthm} 7 | \usepackage{fancyhdr} 8 | \usepackage{drawmatrix} 9 | \usepackage{hyperref} 10 | \usepackage{caption} 11 | \usepackage{enumitem} 12 | \usepackage[bottom]{footmisc} 13 | \usepackage{pdfpages} 14 | \usepackage{xepersian} 15 | \usepackage{fontspec} 16 | 17 | \makeatletter 18 | \renewcommand{\@biblabel}[1]{[#1]\hfill} 19 | \makeatother 20 | 21 | \pagestyle{fancy} 22 | \renewcommand{\footrulewidth}{0pt} 23 | 24 | % \settextfont[]{XB Niloofar} 25 | % \setmainfont{XB-Niloofar}[ 26 | % Path = ./fonts/, 27 | % Extension = .ttf, 28 | % BoldFont = XB-NiloofarBd, 29 | % ItalicFont = XB-NiloofarIt 30 | % ] 31 | \settextfont[Scale=1.0, 32 | BoldFont=*Bd, 33 | ItalicFont=*It, 34 | BoldItalicFont=*BdIt, 35 | Extension=.ttf, 36 | Path=./fonts/]{XB-Niloofar} 37 | -------------------------------------------------------------------------------- /sections/biblography.tex: -------------------------------------------------------------------------------- 1 | \setLTRbibitems 2 | \begin{thebibliography}{9} 3 | • G. Golub and W. Kahan, Calculating the Singular Values and 4 | 5 | Pseudo-Inverse of a Matrix, SIAM. J. Numer. Anal., Vol. 2, 1965, pp. 6 | 202-224 7 | 8 | • J. Wilkinson, Calculation of the eigenvalues of a symmetric tridiagonal 9 | matrix by the method of bisection, Numerische Mathematik, Vol. 4, 1962, 10 | pp. 362-367. 11 | 12 | • G. Golub and P. Businger, Least Squares, Singular Values and Matrix 13 | Approximations, Stanford Technical Report No. CS73, 1967 14 | 15 | • G. H. Golub and C. Reinsch, Singular Value Decomposition and Least 16 | Squares Solutions, Numer. Math., Vol. 14, 1970, pp. 403-420. 17 | 18 | • J. Wilkinson and Chr. Reinsch, Linear Algebra, Springer, 1971. 19 | 20 | • Raymond H. Chan, Chen Greif and Dianne P. O’Leary eds., Milestones in 21 | Matrix Computation: Selected Works of Gene H. Golub, with 22 | Commentaries, Oxford University Press, 2007. 23 | 24 | \end{thebibliography} -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # golub kahan 2 | 3 | 4 | The **Golub–Kahan method** is one of the prominent and efficient algorithms for computing the **Singular Value Decomposition (SVD)**, introduced by **Gene Golub** and **William Kahan** in **1965**. This method is recognized as a significant advancement in the field of **numerical linear algebra** and, due to its unique features, is widely used in **computer science**, **engineering**, and **data analysis**. We finish the report by implementing aforementioned iterative methods using Sympy and Jupyter Notebook. 5 | 6 | if you only want to read the report, check out the PDF `main.pdf`. Notebook is both embedded in the report and available at `CODE.ipynb`. Make sure to install [numpy](https://numpy.org/) before running the code. 7 | 8 | `$ pip install numpy` 9 | ### Build Yourself 10 | You will need the following requirements 11 | - Tex Live 12 | - [Xetex](https://www.ctan.org/pkg/xetex), a packge for rendering Farsi letters in Tex 13 | 14 | ### Acknowledgements 15 | This work was done as part of an undergraduate course in Numerical Linear Algebra by Amirkabir University of Technology. I wanted to thank Dr. Akbar Shirilord for his invaluable advice, continuous support, and detailed feedbacks. 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /sections/summary.tex: -------------------------------------------------------------------------------- 1 | \section{مقدمه} 2 | 3 | 4 | روش گولوب-کاهان یکی از الگوریتم‌های برجسته و کارآمد برای محاسبه تجزیه مقدار منفرد (SVD) است که توسط جین گولوب و ویلیام کاهان در سال 1965 معرفی شد. این روش به عنوان یک پیشرفت مهم در حوزه جبر خطی عددی شناخته می‌شود و به دلیل ویژگی‌های منحصر به فرد خود، به طور گسترده در علوم کامپیوتر، مهندسی و تحلیل داده‌ها مورد استفاده قرار می‌گیرد. الگوریتم گولوب-کاهان با بهره‌گیری از بازتاب‌های هوسهولدر، ماتریس اصلی را به یک ماتریس بیدیگونال تبدیل می‌کند. این تبدیل، فرآیند محاسبه SVD را بهینه‌سازی کرده و پیچیدگی محاسباتی را به طور قابل توجهی کاهش می‌دهد. 5 | 6 | یکی از مزایای برجسته این روش، پایداری عددی بالای آن است که باعث کاهش خطاهای گردشی و افزایش دقت نتایج می‌شود. بازتاب‌های هوسهولدر که در این الگوریتم به کار گرفته می‌شوند، امکان حفظ ساختار ماتریس‌های نادر (Sparse) را فراهم کرده و کارایی حافظه را بهبود می‌بخشند. این ویژگی‌ها، الگوریتم گولوب-کاهان را به یک انتخاب مناسب برای تحلیل داده‌های بزرگ‌مقیاس و کاربردهای علمی و مهندسی تبدیل کرده‌اند. 7 | 8 | علاوه بر این، روش گولوب-کاهان با سایر روش‌های عددی، مانند روش‌های تکراری، سازگاری خوبی دارد و می‌تواند در ترکیب با آنها به نتایج بهتری منجر شود. در مقایسه با روش‌های مرسوم مانند الگوریتم ، گولوب-کاهان نه تنها از لحاظ کارایی و دقت برتری دارد، بلکه از نظر پایداری عددی نیز مطمئن‌تر است. این ویژگی‌ها باعث شده‌اند که این روش در بسیاری از زمینه‌های کاربردی، از جمله پردازش تصویر، تحلیل داده‌های ژنومی و مدل‌سازی‌های علمی، مورد استفاده قرار گیرد. 9 | 10 | در نتیجه، الگوریتم گولوب-کاهان به عنوان یکی از ابزارهای اساسی در جبر خطی عددی شناخته می‌شود که توانسته است با بهبود کارایی محاسبات و حفظ دقت نتایج، سهم بسزایی در پیشرفت علوم محاسباتی و تحلیل داده‌ها ایفا کند. این روش همچنان به عنوان یک استاندارد در بسیاری از کاربردهای عملی و تحقیقاتی مورد توجه و استفاده قرار دارد. 11 | -------------------------------------------------------------------------------- /sections/direct_solution.tex: -------------------------------------------------------------------------------- 1 | \section{مزایای الگوریتم گولوب-کاهان} 2 | 3 | الگوریتم گولوب-کاهان برای محاسبه تجزیه مقدار منفرد (SVD) مزایای قابل توجهی دارد که آن را به یکی از روش‌های پرکاربرد در ریاضیات عددی و پردازش داده‌ها تبدیل کرده است. در ادامه به بررسی هر یک از این مزایا پرداخته می‌شود: 4 | 5 | \subsection{پایداری عددی} 6 | 7 | پایداری عددی به توانایی یک الگوریتم در کاهش خطاهای ناشی از محاسبات عددی اشاره دارد. این مسئله در محاسبات با اعداد بسیار بزرگ یا بسیار کوچک که ممکن است منجر به خطاهای گرد کردن یا ناپایداری‌های عددی شود، اهمیت ویژه‌ای دارد. 8 | 9 | \textbf{دلیل:} 10 | 11 | \begin{itemize} 12 | \item \textit{استفاده از بازتاب‌های هوسهولدر}: این بازتاب‌ها برای تبدیل ماتریس اصلی به ماتریس بیدیگونال استفاده می‌شوند و به حفظ ساختار عددی ماتریس کمک می‌کنند. 13 | \item \textit{کاهش خطاهای تکراری}: تبدیل ماتریس به شکل بیدیگونال قبل از اعمال الگوریتم‌های تکراری، احتمال افزایش خطاهای عددی در طی مراحل تکرار را کاهش می‌دهد، زیرا این تبدیل ماتریس اصلی را به یک فرم ساده‌تر و عددی پایدارتر تبدیل می‌کند. 14 | \end{itemize} 15 | 16 | \subsection{کارایی محاسباتی} 17 | 18 | الگوریتم گولوب-کاهان به دلیل بهینه‌سازی مراحل محاسباتی و کاهش تعداد عملیات‌های مورد نیاز برای تجزیه ماتریس‌ها، کارایی بالایی دارد. 19 | 20 | \textbf{دلیل:} 21 | 22 | \begin{itemize} 23 | \item \textit{پیچیدگی محاسباتی کمتر}: تبدیل ماتریس به شکل بیدیگونال باعث کاهش تعداد عملیات‌های ضرب ماتریس و بردار می‌شود. این به این معناست که الگوریتم می‌تواند با پیچیدگی محاسباتی کمتری ماتریس‌ها را تجزیه کند. 24 | \item \textit{تکرار سریع}: الگوریتم‌های تکراری مانند QR زمانی که بر روی ماتریس بیدیگونال اعمال می‌شوند، سریع‌تر عمل می‌کنند. این به دلیل ساختار ساده‌تر و کم‌تراکم‌تر ماتریس بیدیگونال نسبت به ماتریس اصلی است. 25 | \end{itemize} 26 | 27 | \subsection{دقت نتایج} 28 | 29 | یکی از ویژگی‌های مهم الگوریتم گولوب-کاهان، دقت بالای نتایج آن است که این مسئله در کاربردهای مختلف بسیار مهم است. 30 | 31 | \textbf{دلیل:} 32 | 33 | \begin{itemize} 34 | \item \textit{حفظ مقادیر منفرد}: این الگوریتم به صورت دقیق مقادیر منفرد ماتریس را محاسبه می‌کند. مقادیر منفرد نمایانگر ویژگی‌های مهمی از ماتریس اصلی هستند و دقت بالا در محاسبه آن‌ها منجر به تحلیل دقیق‌تر داده‌ها می‌شود. 35 | \item \textit{تقریب بهینه}: با استفاده از این الگوریتم، تقریب بسیار دقیقی از مقادیر منفرد و بردارهای منفرد ماتریس به دست می‌آید. این امر به خصوص در کاربردهایی مانند فشرده‌سازی داده‌ها و کاهش ابعاد داده‌ها که نیاز به دقت بالا دارند، بسیار مهم است. 36 | \end{itemize} 37 | 38 | \subsection{کاربرد در ماتریس‌های بزرگ و نادر} 39 | 40 | الگوریتم گولوب-کاهان به خوبی برای کار با ماتریس‌های بزرگ و نادر (Sparse) بهینه‌سازی شده است. 41 | 42 | \textbf{دلیل:} 43 | 44 | \begin{itemize} 45 | \item \textit{مدیریت حافظه}: این الگوریتم از بازتاب‌های هوسهولدر و ماتریس‌های بیدیگونال برای کاهش نیاز به حافظه استفاده می‌کند. با این کار، فضای حافظه مورد نیاز برای ذخیره و پردازش ماتریس‌ها بهینه‌سازی شده و امکان پردازش ماتریس‌های بسیار بزرگ فراهم می‌شود. 46 | \item \textit{بهینه‌سازی برای ماتریس‌های نادر}: الگوریتم می‌تواند به صورت بهینه ماتریس‌های نادر را پردازش کند. این مسئله باعث می‌شود تا زمان و حافظه صرف شده برای پردازش ماتریس‌هایی که بخش زیادی از عناصرشان صفر است، کاهش یابد. 47 | \end{itemize} 48 | 49 | \subsection{مزایای کلی الگوریتم گولوب-کاهان} 50 | 51 | با توجه به مزایای فوق، الگوریتم گولوب-کاهان یکی از ابزارهای قدرتمند در ریاضیات عددی و پردازش داده‌ها است. این الگوریتم در بسیاری از کاربردهای عملی مانند تحلیل داده‌های بزرگ، فشرده‌سازی داده‌ها، و تجزیه و تحلیل تصاویر استفاده می‌شود. پایداری عددی، کارایی محاسباتی، دقت نتایج و توانایی کار با ماتریس‌های بزرگ و نادر، از جمله ویژگی‌های برجسته‌ای هستند که این الگوریتم را از دیگر روش‌های مشابه متمایز می‌کنند. این ویژگی‌ها سبب شده‌اند که الگوریتم گولوب-کاهان به عنوان یکی از بهترین روش‌ها برای محاسبه SVD در مسائل عملی و تحقیقاتی شناخته شود. 52 | -------------------------------------------------------------------------------- /sections/iterative_solution.tex: -------------------------------------------------------------------------------- 1 | \section{مزایای الگوریتم گولوب-کاهان} 2 | 3 | الگوریتم گولوب-کاهان برای محاسبه تجزیه مقدار منفرد (SVD) مزایای قابل توجهی دارد که آن را به یکی از روش‌های پرکاربرد در ریاضیات عددی و پردازش داده‌ها تبدیل کرده است. در ادامه به بررسی هر یک از این مزایا پرداخته می‌شود: 4 | 5 | \subsection{پایداری عددی} 6 | 7 | پایداری عددی به توانایی یک الگوریتم در کاهش خطاهای ناشی از محاسبات عددی اشاره دارد. این مسئله در محاسبات با اعداد بسیار بزرگ یا بسیار کوچک که ممکن است منجر به خطاهای گرد کردن یا ناپایداری‌های عددی شود، اهمیت ویژه‌ای دارد. 8 | 9 | \textbf{دلیل:} 10 | 11 | \begin{itemize} 12 | \item \textit{استفاده از بازتاب‌های هوسهولدر}: این بازتاب‌ها برای تبدیل ماتریس اصلی به ماتریس بیدیگونال استفاده می‌شوند و به حفظ ساختار عددی ماتریس کمک می‌کنند. بازتاب‌های هوسهولدر به دلیل ماهیت ارتوگونال‌شان، از تجمع خطاهای گرد کردن جلوگیری می‌کنند. 13 | \item \textit{کاهش خطاهای تکراری}: تبدیل ماتریس به شکل بیدیگونال قبل از اعمال الگوریتم‌های تکراری، احتمال افزایش خطاهای عددی در طی مراحل تکرار را کاهش می‌دهد، زیرا این تبدیل ماتریس اصلی را به یک فرم ساده‌تر و عددی پایدارتر تبدیل می‌کند. 14 | \end{itemize} 15 | 16 | \subsection{کارایی محاسباتی} 17 | 18 | الگوریتم گولوب-کاهان به دلیل بهینه‌سازی مراحل محاسباتی و کاهش تعداد عملیات‌های مورد نیاز برای تجزیه ماتریس‌ها، کارایی بالایی دارد. 19 | 20 | \textbf{دلیل:} 21 | 22 | \begin{itemize} 23 | \item \textit{پیچیدگی محاسباتی کمتر}: تبدیل ماتریس به شکل بیدیگونال باعث کاهش تعداد عملیات‌های ضرب ماتریس و بردار می‌شود. این به این معناست که الگوریتم می‌تواند با پیچیدگی محاسباتی کمتری ماتریس‌ها را تجزیه کند. 24 | \item \textit{تکرار سریع}: الگوریتم‌های تکراری مانند QR زمانی که بر روی ماتریس بیدیگونال اعمال می‌شوند، سریع‌تر عمل می‌کنند. این به دلیل ساختار ساده‌تر و کم‌تراکم‌تر ماتریس بیدیگونال نسبت به ماتریس اصلی است. 25 | \end{itemize} 26 | 27 | \subsection{دقت نتایج} 28 | 29 | یکی از ویژگی‌های مهم الگوریتم گولوب-کاهان، دقت بالای نتایج آن است که این مسئله در کاربردهای مختلف بسیار مهم است. 30 | 31 | \textbf{دلیل:} 32 | 33 | \begin{itemize} 34 | \item \textit{حفظ مقادیر منفرد}: این الگوریتم به صورت دقیق مقادیر منفرد ماتریس را محاسبه می‌کند. مقادیر منفرد نمایانگر ویژگی‌های مهمی از ماتریس اصلی هستند و دقت بالا در محاسبه آن‌ها منجر به تحلیل دقیق‌تر داده‌ها می‌شود. 35 | \item \textit{تقریب بهینه}: با استفاده از این الگوریتم، تقریب بسیار دقیقی از مقادیر منفرد و بردارهای منفرد ماتریس به دست می‌آید. این امر به خصوص در کاربردهایی مانند فشرده‌سازی داده‌ها و کاهش ابعاد داده‌ها که نیاز به دقت بالا دارند، بسیار مهم است. 36 | \end{itemize} 37 | 38 | \subsection{کاربرد در ماتریس‌های بزرگ و نادر} 39 | 40 | الگوریتم گولوب-کاهان به خوبی برای کار با ماتریس‌های بزرگ و نادر (Sparse) بهینه‌سازی شده است. 41 | 42 | \textbf{دلیل:} 43 | 44 | \begin{itemize} 45 | \item \textit{مدیریت حافظه}: این الگوریتم از بازتاب‌های هوسهولدر و ماتریس‌های بیدیگونال برای کاهش نیاز به حافظه استفاده می‌کند. با این کار، فضای حافظه مورد نیاز برای ذخیره و پردازش ماتریس‌ها بهینه‌سازی شده و امکان پردازش ماتریس‌های بسیار بزرگ فراهم می‌شود. 46 | \item \textit{بهینه‌سازی برای ماتریس‌های نادر}: الگوریتم می‌تواند به صورت بهینه ماتریس‌های نادر را پردازش کند. این مسئله باعث می‌شود تا زمان و حافظه صرف شده برای پردازش ماتریس‌هایی که بخش زیادی از عناصرشان صفر است، کاهش یابد. 47 | \end{itemize} 48 | 49 | \subsection{مزایای کلی الگوریتم گولوب-کاهان} 50 | 51 | با توجه به مزایای فوق، الگوریتم گولوب-کاهان یکی از ابزارهای قدرتمند در ریاضیات عددی و پردازش داده‌ها است. این الگوریتم در بسیاری از کاربردهای عملی مانند تحلیل داده‌های بزرگ، فشرده‌سازی داده‌ها، و تجزیه و تحلیل تصاویر استفاده می‌شود. پایداری عددی، کارایی محاسباتی، دقت نتایج و توانایی کار با ماتریس‌های بزرگ و نادر، از جمله ویژگی‌های برجسته‌ای هستند که این الگوریتم را از دیگر روش‌های مشابه متمایز می‌کنند. این ویژگی‌ها سبب شده‌اند که الگوریتم گولوب-کاهان به عنوان یکی از بهترین روش‌ها برای محاسبه SVD در مسائل عملی و تحقیقاتی شناخته شود. 52 | -------------------------------------------------------------------------------- /sections/numeric_examples.tex: -------------------------------------------------------------------------------- 1 | \section{مثال عددی از الگوریتم بیدیاگونالیزاسیون گولوب-کاهان} 2 | 3 | فرض کنید ماتریس \( A \) به صورت زیر باشد: 4 | \[ 5 | A = \begin{bmatrix} 6 | 1 & 2 & 3 \\ 7 | 4 & 5 & 6 \\ 8 | 7 & 8 & 9 9 | \end{bmatrix} 10 | \] 11 | 12 | \subsection*{گام اول: بازتاب هوسهولدر از چپ \lr{(i = 1)}} 13 | \begin{align*} 14 | B &= \begin{bmatrix} 15 | 1 & 2 & 3 \\ 16 | 4 & 5 & 6 \\ 17 | 7 & 8 & 9 18 | \end{bmatrix} \\ 19 | x &= \begin{bmatrix} 20 | 1 \\ 21 | 4 \\ 22 | 7 23 | \end{bmatrix} \\ 24 | v &= \begin{bmatrix} 25 | 0.75 \\ 26 | 0.33 \\ 27 | 0.57 28 | \end{bmatrix} \\ 29 | H &= I - 2 \frac{vv^T}{v^T v} = \begin{bmatrix} 30 | -0.12 & -0.49 & -0.86 \\ 31 | -0.49 & 0.78 & -0.38 \\ 32 | -0.86 & -0.38 & 0.34 33 | \end{bmatrix} \\ 34 | \text{ضرب } H \cdot B &= \begin{bmatrix} 35 | -0.12 & -0.49 & -0.86 \\ 36 | -0.49 & 0.78 & -0.38 \\ 37 | -0.86 & -0.38 & 0.34 38 | \end{bmatrix} \cdot \begin{bmatrix} 39 | 1 & 2 & 3 \\ 40 | 4 & 5 & 6 \\ 41 | 7 & 8 & 9 42 | \end{bmatrix} = \begin{bmatrix} 43 | -8.12 & -9.6 & -11.08 \\ 44 | 0 & -0.09 & -0.17 \\ 45 | 0 & -0.9 & -1.8 46 | \end{bmatrix} \\ 47 | \text{بروزرسانی } U &= I \cdot H = \begin{bmatrix} 48 | -0.12 & -0.49 & -0.86 \\ 49 | -0.49 & 0.78 & -0.38 \\ 50 | -0.86 & -0.38 & 0.34 51 | \end{bmatrix} 52 | \end{align*} 53 | 54 | \subsection*{گام دوم: بازتاب هوسهولدر از راست \lr{(i = 0)}} 55 | \begin{align*} 56 | B &= \begin{bmatrix} 57 | -8.12 & -9.6 & -11.08 \\ 58 | 0 & -0.09 & -0.17 \\ 59 | 0 & -0.9 & -1.8 60 | \end{bmatrix} \\ 61 | x &= \begin{bmatrix} 62 | -9.6 \\ 63 | -11.08 64 | \end{bmatrix} \\ 65 | v &= \begin{bmatrix} 66 | -0.91 \\ 67 | -0.42 68 | \end{bmatrix} \\ 69 | H &= I - 2 \frac{vv^T}{v^T v} = \begin{bmatrix} 70 | -0.65 & -0.76 \\ 71 | -0.76 & 0.65 72 | \end{bmatrix} \\ 73 | \text{ضرب } B \cdot H &= \begin{bmatrix} 74 | -9.6011363 & -11.07823419 \\ 75 | -0.08596557 & -0.17193114 \\ 76 | -0.90043975 & -1.8008795 77 | \end{bmatrix} \cdot \begin{bmatrix} 78 | -0.65 & -0.76 \\ 79 | -0.76 & 0.65 80 | \end{bmatrix} = \begin{bmatrix} 81 | -8.12 & 14.66 & -0 \\ 82 | 0 & 0.19 & -0.05 \\ 83 | 0 & 1.95 & -0.5 84 | \end{bmatrix} \\ 85 | \text{بروزرسانی } V &= \begin{bmatrix} 86 | 1 & 0 & 0 \\ 87 | 0 & -0.65 & -0.76 \\ 88 | 0 & -0.76 & 0.65 89 | \end{bmatrix} 90 | \end{align*} 91 | 92 | \subsection*{گام سوم: بازتاب هوسهولدر از چپ \lr{(i = 1)}} 93 | \begin{align*} 94 | B &= \begin{bmatrix} 95 | -8.12 & 14.66 & -0 \\ 96 | 0 & 0.19 & -0.05 \\ 97 | 0 & 1.95 & -0.5 98 | \end{bmatrix} \\ 99 | x &= \begin{bmatrix} 100 | 0.19 \\ 101 | 1.95 102 | \end{bmatrix} \\ 103 | v &= \begin{bmatrix} 104 | 0.74 \\ 105 | 0.67 106 | \end{bmatrix} \\ 107 | H &= I - 2 \frac{vv^T}{v^T v} = \begin{bmatrix} 108 | -0.1 & -1 \\ 109 | -1 & 0.1 110 | \end{bmatrix} \\ 111 | \text{ضرب } H \cdot B &= \begin{bmatrix} 112 | -0.1 & -1 \\ 113 | -1 & 0.1 114 | \end{bmatrix} \cdot \begin{bmatrix} 115 | 0 & 0.19 & -0.05 \\ 116 | 0 & 1.95 & -0.5 117 | \end{bmatrix} = \begin{bmatrix} 118 | -8.12 & 14.66 & -0 \\ 119 | -0 & -1.96 & 0.5 \\ 120 | -0 & -0 & 0 121 | \end{bmatrix} \\ 122 | \text{بروزرسانی } U &= \begin{bmatrix} 123 | -0.49 & -0.86 \\ 124 | 0.78 & -0.38 \\ 125 | -0.38 & 0.34 126 | \end{bmatrix} \cdot \begin{bmatrix} 127 | -0.1 & -1 \\ 128 | -1 & 0.1 129 | \end{bmatrix} = \begin{bmatrix} 130 | -0.12 & 0.9 & 0.41 \\ 131 | -0.49 & 0.3 & -0.82 \\ 132 | -0.86 & -0.3 & 0.41 133 | \end{bmatrix} 134 | \end{align*} 135 | 136 | \subsection*{گام چهارم: بازتاب هوسهولدر از راست \lr{(i = 1)}} 137 | \begin{align*} 138 | B &= \begin{bmatrix} 139 | -8.12 & 14.66 & -0 \\ 140 | -0 & -1.96 & 0.5 \\ 141 | -0 & -0 & 0 142 | \end{bmatrix} \\ 143 | x &= \begin{bmatrix} 144 | 0.5 145 | \end{bmatrix} \\ 146 | v &= \begin{bmatrix} 147 | 1 148 | \end{bmatrix} \\ 149 | H &= I - 2 \frac{vv^T}{v^T v} = \begin{bmatrix} 150 | -1 151 | \end{bmatrix} \\ 152 | \text{ضرب } B \cdot H &= \begin{bmatrix} 153 | -8.12 & 14.66 & -0 \\ 154 | -0 & -1.96 & 0.5 \\ 155 | -0 & -0 & 0 156 | \end{bmatrix} \cdot \begin{bmatrix} 157 | -1 158 | \end{bmatrix} = \begin{bmatrix} 159 | -8.12 & 14.66 & 0 \\ 160 | -0 & -1.96 & -0.5 \\ 161 | -0 & -0 & -0 162 | \end{bmatrix} \\ 163 | \text{بروزرسانی } V &= \begin{bmatrix} 164 | 1 & 0 & 0 \\ 165 | 0 & -0.65 & 0.76 \\ 166 | 0 & -0.76 & -0.65 167 | \end{bmatrix} 168 | \end{align*} 169 | 170 | \subsection*{گام پنجم: بازتاب هوسهولدر از چپ \lr{(i = 2)}} 171 | \begin{align*} 172 | B &= \begin{bmatrix} 173 | -8.12 & 14.66 & 0 \\ 174 | -0 & -1.96 & -0.5 \\ 175 | -0 & -0 & -0 176 | \end{bmatrix} \\ 177 | x &= \begin{bmatrix} 178 | -0 179 | \end{bmatrix} \\ 180 | v &= \begin{bmatrix} 181 | -1 182 | \end{bmatrix} \\ 183 | H &= I - 2 \frac{vv^T}{v^T v} = \begin{bmatrix} 184 | -1 185 | \end{bmatrix} \\ 186 | \text{ضرب } H \cdot B &= \begin{bmatrix} 187 | -1 188 | \end{bmatrix} \cdot \begin{bmatrix} 189 | -0 & -0 & -0 190 | \end{bmatrix} = \begin{bmatrix} 191 | -8.12 & 14.66 & 0 \\ 192 | -0 & -1.96 & -0.5 \\ 193 | 0 & 0 & 0 194 | \end{bmatrix} \\ 195 | \text{بروزرسانی } U &= \begin{bmatrix} 196 | 0.41 \\ 197 | -0.82 \\ 198 | 0.41 199 | \end{bmatrix} \cdot \begin{bmatrix} 200 | -1 201 | \end{bmatrix} = \begin{bmatrix} 202 | -0.12 & 0.9 & -0.41 \\ 203 | -0.49 & 0.3 & 0.82 \\ 204 | -0.86 & -0.3 & -0.41 205 | \end{bmatrix} 206 | \end{align*} 207 | 208 | در پایان، ماتریس \( B \) بیدیاگونال به صورت زیر است: 209 | \[ 210 | B = \begin{bmatrix} 211 | -8.12 & 14.66 & 0 \\ 212 | -0 & -1.96 & -0.5 \\ 213 | 0 & 0 & 0 214 | \end{bmatrix} 215 | \] 216 | 217 | 218 | -------------------------------------------------------------------------------- /CODE.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [] 7 | }, 8 | "kernelspec": { 9 | "name": "python3", 10 | "display_name": "Python 3" 11 | }, 12 | "language_info": { 13 | "name": "python" 14 | } 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "metadata": { 21 | "id": "JE1TNYsUHdNS" 22 | }, 23 | "outputs": [], 24 | "source": [ 25 | "import numpy as np" 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "source": [ 31 | "#Implementation" 32 | ], 33 | "metadata": { 34 | "id": "O3XQ-KQeIayh" 35 | } 36 | }, 37 | { 38 | "cell_type": "code", 39 | "source": [ 40 | "def householder_reflection(a):\n", 41 | " \"\"\"\n", 42 | " Create a Householder reflection matrix for a vector a.\n", 43 | "\n", 44 | " Parameters:\n", 45 | " a (numpy.ndarray): Input vector.\n", 46 | "\n", 47 | " Returns:\n", 48 | " v (numpy.ndarray): Householder reflection vector.\n", 49 | " \"\"\"\n", 50 | " v = a.copy()\n", 51 | " v[0] += np.sign(a[0]) * np.linalg.norm(a)\n", 52 | " v = v / np.linalg.norm(v)\n", 53 | " return v\n", 54 | "\n", 55 | "\n", 56 | "def golub_kahan_bidiagonalization(A):\n", 57 | " \"\"\"\n", 58 | " Perform Golub-Kahan bidiagonalization on matrix A.\n", 59 | "\n", 60 | " Parameters:\n", 61 | " A (numpy.ndarray): Input matrix with shape (m, n).\n", 62 | "\n", 63 | " Returns:\n", 64 | " B (numpy.ndarray): Bidiagonal matrix.\n", 65 | " U (numpy.ndarray): Orthogonal matrix U.\n", 66 | " V (numpy.ndarray): Orthogonal matrix V.\n", 67 | " \"\"\"\n", 68 | " m, n = A.shape\n", 69 | " U = np.eye(m)\n", 70 | " V = np.eye(n)\n", 71 | " B = A.copy()\n", 72 | "\n", 73 | " for i in range(min(m, n)):\n", 74 | " # Householder's reflection from the left\n", 75 | " x = B[i:, i]\n", 76 | " v = householder_reflection(x)\n", 77 | " H = np.eye(m - i) - 2 * np.outer(v, v)\n", 78 | " B[i:, :] = np.dot(H, B[i:, :])\n", 79 | " U[:, i:] = np.dot(U[:, i:], H)\n", 80 | " if i < n - 1:\n", 81 | " # Householder's reflection from the right\n", 82 | " x = B[i, i+1:]\n", 83 | " v = householder_reflection(x)\n", 84 | " H = np.eye(n - (i+1)) - 2 * np.outer(v, v)\n", 85 | " B[:, i+1:] = np.dot(B[:, i+1:], H)\n", 86 | " V[:, i+1:] = np.dot(V[:, i+1:], H)\n", 87 | "\n", 88 | " return B, U, V\n", 89 | "\n", 90 | "\n", 91 | "def compute_svd_from_bidiagonal(B, U, V):\n", 92 | " m, n = B.shape\n", 93 | " U_b, Sigma, Vt_b = np.linalg.svd(B)\n", 94 | " U = np.dot(U, U_b)\n", 95 | " V = np.dot(V, Vt_b.T)\n", 96 | " return U, Sigma, V.T\n", 97 | "\n", 98 | "\n", 99 | "def reconstruct_matrix(U, Sigma, Vt):\n", 100 | " Sigma_mat = np.zeros((U.shape[0], Vt.shape[1]))\n", 101 | " np.fill_diagonal(Sigma_mat, Sigma)\n", 102 | " A_reconstructed = np.dot(U, np.dot(Sigma_mat, Vt))\n", 103 | " return A_reconstructed" 104 | ], 105 | "metadata": { 106 | "id": "J6e_dtSGHe5V" 107 | }, 108 | "execution_count": 2, 109 | "outputs": [] 110 | }, 111 | { 112 | "cell_type": "markdown", 113 | "source": [ 114 | "#Example" 115 | ], 116 | "metadata": { 117 | "id": "VIuvdXCIIdSc" 118 | } 119 | }, 120 | { 121 | "cell_type": "code", 122 | "source": [ 123 | "A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=float)\n", 124 | "A" 125 | ], 126 | "metadata": { 127 | "colab": { 128 | "base_uri": "https://localhost:8080/" 129 | }, 130 | "id": "bxgRfFnEITVj", 131 | "outputId": "69d5bf54-bf3d-4cff-81ae-87f683941bb8" 132 | }, 133 | "execution_count": 3, 134 | "outputs": [ 135 | { 136 | "output_type": "execute_result", 137 | "data": { 138 | "text/plain": [ 139 | "array([[1., 2., 3.],\n", 140 | " [4., 5., 6.],\n", 141 | " [7., 8., 9.]])" 142 | ] 143 | }, 144 | "metadata": {}, 145 | "execution_count": 3 146 | } 147 | ] 148 | }, 149 | { 150 | "cell_type": "code", 151 | "source": [ 152 | "\n", 153 | "B, U, V = golub_kahan_bidiagonalization(A)\n", 154 | "U_svd, Sigma, Vt_svd = compute_svd_from_bidiagonal(B, U, V)\n", 155 | "A_reconstructed = reconstruct_matrix(U_svd, Sigma, Vt_svd)\n", 156 | "A_reconstructed\n", 157 | "\n", 158 | "np.round(Sigma, 3)" 159 | ], 160 | "metadata": { 161 | "colab": { 162 | "base_uri": "https://localhost:8080/" 163 | }, 164 | "id": "B-gqeDgIIXBd", 165 | "outputId": "f4150bfa-5144-40f4-8018-be88a2f5f343" 166 | }, 167 | "execution_count": 4, 168 | "outputs": [ 169 | { 170 | "output_type": "execute_result", 171 | "data": { 172 | "text/plain": [ 173 | "array([16.848, 1.068, 0. ])" 174 | ] 175 | }, 176 | "metadata": {}, 177 | "execution_count": 4 178 | } 179 | ] 180 | }, 181 | { 182 | "cell_type": "code", 183 | "source": [], 184 | "metadata": { 185 | "id": "R5h8PXitIXWM" 186 | }, 187 | "execution_count": null, 188 | "outputs": [] 189 | } 190 | ] 191 | } -------------------------------------------------------------------------------- /sections/introduction.tex: -------------------------------------------------------------------------------- 1 | \section{الگوریتم گولوب-کاهان} 2 | الگوریتم گولوب-کاهان به دو مرحله اصلی تقسیم می‌شود: 3 | 4 | \begin{itemize} 5 | \item تبدیل ماتریس به ماتریس بیدیگونال 6 | 7 | \item و محاسبه SVD از شکل بیدیگونال. 8 | 9 | \end{itemize} 10 | 11 | 12 | 13 | 14 | 15 | 16 | این مراحل در زیر با جزئیات توضیح داده شده‌اند. 17 | 18 | \subsection{تبدیل ماتریس به ماتریس بیدیگونال} 19 | 20 | \subsubsection{ماتریس بیدیگونال} 21 | 22 | 23 | ماتریس بیدیگونال \lr{(Bidiagonal Matrix)} یک ماتریس مربعی است که تنها دارای عناصر غیر صفر بر روی قطر اصلی و یک باند زیر یا بالای قطر اصلی است. به عبارتی، در ماتریس بیدیگونال فقط عناصر روی قطر اصلی و عناصر یک ردیف یا یک ستون بالاتر یا پایین‌تر از قطر اصلی غیر صفر هستند. 24 | 25 | 26 | در ماتریس‌ها، اصطلاحات "باند بالا" و "باند پایین" به عناصر غیرصفر ماتریس در نزدیکی قطر اصلی اشاره دارند. بیایید به تعریف و مثال‌های بیشتری بپردازیم تا مفهوم آن را روشن‌تر کنیم. 27 | 28 | \paragraph{ماتریس بیدیگونال بالا} 29 | 30 | 31 | 32 | یک ماتریس بیدیگونال بالا به شکل زیر است: 33 | 34 | 35 | \[ 36 | B_{\text{up}} = \begin{pmatrix} 37 | a_{11} & a_{12} & 0 & 0 \\ 38 | 0 & a_{22} & a_{23} & 0 \\ 39 | 0 & 0 & a_{33} & a_{34} \\ 40 | 0 & 0 & 0 & a_{44} 41 | \end{pmatrix} 42 | \] 43 | 44 | که در آن \(a_{11}, a_{12}, a_{22}, a_{23}, a_{33}, a_{34}, a_{44}\) می‌توانند هر مقدار عددی باشند. 45 | 46 | مثال عددی بیدیگونال بالا: 47 | 48 | \[ 49 | B_{\text{up}} = \begin{pmatrix} 50 | 4 & 2 & 0 & 0 \\ 51 | 0 & 3 & 1 & 0 \\ 52 | 0 & 0 & 5 & 3 \\ 53 | 0 & 0 & 0 & 6 54 | \end{pmatrix} 55 | \] 56 | 57 | در این مثال، عناصر غیرصفر در باند بالای قطر اصلی عبارتند از \(2, 1, 3\). 58 | 59 | 60 | \paragraph{ماتریس بیدیگونال پایین} 61 | 62 | 63 | یک ماتریس بیدیگونال پایین به شکل زیر است: 64 | 65 | \[ 66 | B_{\text{low}} = \begin{pmatrix} 67 | a_{11} & 0 & 0 & 0 \\ 68 | a_{21} & a_{22} & 0 & 0 \\ 69 | 0 & a_{32} & a_{33} & 0 \\ 70 | 0 & 0 & a_{43} & a_{44} 71 | \end{pmatrix} 72 | \] 73 | 74 | که در آن \(a_{11}, a_{21}, a_{22}, a_{32}, a_{33}, a_{43}, a_{44}\) می‌توانند هر مقدار عددی باشند. 75 | 76 | مثال عددی بیدیگونال پایین: 77 | 78 | \[ 79 | B_{\text{low}} = \begin{pmatrix} 80 | 4 & 0 & 0 & 0 \\ 81 | 2 & 3 & 0 & 0 \\ 82 | 0 & 1 & 5 & 0 \\ 83 | 0 & 0 & 3 & 6 84 | \end{pmatrix} 85 | \] 86 | 87 | در این مثال، عناصر غیرصفر در باند پایین قطر اصلی عبارتند از \(2, 1, 3\). 88 | 89 | 90 | 91 | 92 | 93 | در الگوریتم گولوپ-کاهان برای محاسبه SVD، معمولاً از ماتریس بیدیگونال بالا \lr{(upper bidiagonal matrix)} استفاده می‌شود. این به این معناست که ماتریس اولیه به صورتی تبدیل می‌شود که عناصر غیرصفر تنها در قطر اصلی و یک ردیف بالاتر از قطر اصلی قرار دارند. این نوع ماتریس بیدیگونال بالا به دلیل ساختار ساده‌تری که دارد، برای محاسبات عددی و پیاده‌سازی الگوریتم‌های تجزیه مانند SVD مناسب‌تر است. 94 | 95 | \pagebreak 96 | 97 | \subsection{الگوریتم بیدیاگونالیزاسیون گولوب-کاهان} 98 | 99 | \subsection*{ورودی و خروجی‌ها} 100 | \begin{itemize} 101 | \item \textbf{ورودی}: ماتریس \( A \) با ابعاد \( m \times n \) 102 | \item \textbf{خروجی‌ها}: 103 | \begin{itemize} 104 | \item ماتریس بیدیاگونال \( B \) با ابعاد \( m \times n \) 105 | \item ماتریس ارتوگونال \( U \) با ابعاد \( m \times m \) 106 | \item ماتریس ارتوگونال \( V \) با ابعاد \( n \times n \) 107 | \end{itemize} 108 | \end{itemize} 109 | 110 | \subsection*{مقداردهی اولیه} 111 | \begin{align*} 112 | U &= I_m \quad \text{(ماتریس واحد \( m \times m \))} \\ 113 | V &= I_n \quad \text{(ماتریس واحد \( n \times n \))} \\ 114 | B &= A 115 | \end{align*} 116 | 117 | \subsection*{حلقه اصلی} 118 | برای \( i = 1 \) تا \( \min(m, n) \): 119 | 120 | 121 | استفاده از \lr{`min(m, n)`} کمک می‌کند تا عملیات bidiagonalization به صورت بهینه‌تری انجام شود، زیرا ما تنها تا حداقل اندازه کوچکترین بُعد از ماتریس A نیاز داریم. این کمک می‌کند که الگوریتم به سرعت به نقاط کلیدی از فرایند برسد. 122 | 123 | 124 | \begin{enumerate} 125 | \item \textbf{بازتاب هوسهولدر از چپ} 126 | بازتاب هوسهولدر از چپ به این صورت عمل می‌کند که با اعمال ماتریس هوسهولدر از سمت چپ به یک ماتریس، مولفه‌های زیر قطر اصلی در یک ستون خاص صفر می‌شوند. به طور مشخص، اگر بازتاب هوسهولدر به یک ماتریس \( A \) از سمت چپ اعمال شود، عناصر زیر قطر اصلی در یک ستون خاص از آن ماتریس صفر خواهند شد. 127 | 128 | 129 | 130 | \begin{itemize} 131 | \item بردار ستون \( x \) از ماتریس \( B \) تعریف می‌شود به صورت: 132 | \[ 133 | x = B[i:m, i] 134 | \] 135 | این نشان می‌دهد که \( x \) برابر است با بردار ستونی از ماتریس \( B \) که از ردیف \( i \)ام تا ردیف \( m \)ام و در ستون \( i \)ام قرار دارد. 136 | 137 | \item بردار بازتاب هوسهولدر \( v \) برای \( x \) محاسبه می‌شود: 138 | \[ 139 | v = x + \text{sign}(x_1) \|x\|_2 e_1 140 | \] 141 | که \( e_1 \) بردار واحد اول است و \(\text{sign}(x_1)\) علامت اولین مولفه \( x \) است. 142 | \item ماتریس هوسهولدر \( H \) ساخته می‌شود: 143 | \[ 144 | H = I_{m-i} - 2 \frac{vv^T}{v^T v} 145 | \] 146 | 147 | در الگوریتم بازتاب هوسهولدر از سمت چپ، ماتریس \( H \) یک ماتریس مربعی است با ابعاد \( (m-i) \times (m-i) \). 148 | \item ماتریس \( B \) به‌روزرسانی می‌شود: 149 | \[ 150 | B[i:m, i:n] = H B[i:m, i:n] 151 | \] 152 | 153 | زیرماتریس \( B[i:m, i:n] \) ابعاد \( (m-i) \times (n-i) \) دارد. 154 | 155 | 156 | \textbf{زیرماتریس \( B \)}: 157 | \begin{itemize} 158 | \item عبارت \( B[i:m, i:n] \) به زیرماتریسی از \( B \) اشاره دارد که از ردیف \( i \) تا ردیف \( m \) و از ستون \( i \) تا ستون \( n \) قرار دارد. این زیرماتریس شامل المان‌هایی است که تحت تاثیر بازتاب هوسهولدر قرار می‌گیرند. 159 | \end{itemize} 160 | \item ماتریس \( U \) به‌روزرسانی می‌شود: 161 | \[ 162 | U[:, i:m] = U[:, i:m] H 163 | \] 164 | 165 | \textbf{زیرماتریس \( U \)}: 166 | \begin{itemize} 167 | \item عبارت \( U[:, i:m] \) به زیرماتریسی از \( U \) اشاره دارد که شامل تمام ردیف‌ها و ستون‌های \( i \) تا \( m \) است. این زیرماتریس نشان‌دهنده بخشی از \( U \) است که باید تحت تاثیر ماتریس هوسهولدر \( H \) قرار گیرد. 168 | 169 | ابعاد \( (m) \times (m-i) \) 170 | \end{itemize} 171 | 172 | \end{itemize} 173 | 174 | \item \textbf{بازتاب هوسهولدر از راست} 175 | زتاب هوسهولدر از راست باعث صفر شدن درایه‌های زیر قطر اصلی ستون‌های ماتریس می‌شود، در حالی که بازتاب هوسهولدر از سمت چپ باعث صفر شدن درایه‌های بالای قطر اصلی سطرهای ماتریس می‌شود. 176 | \begin{itemize} 177 | \item اگر \( i < n \): 178 | \begin{itemize} 179 | \item بردار ردیف \( x \) از ماتریس \( B \) تعریف می‌شود به صورت: 180 | \[ 181 | x = B[i, i+1:n] 182 | \] 183 | ، \( x \) یک بردار است که از سطر \( i \) ام ماتریس \( B \) استخراج شده است، از ستون \( i+1 \) تا ستون \( n \). 184 | 185 | 186 | \item بردار بازتاب هوسهولدر \( v \) برای \( x \) محاسبه می‌شود: 187 | \[ 188 | v = x + \text{sign}(x_1) \|x\|_2 e_1 189 | \] 190 | \item ماتریس هوسهولدر \( H \) ساخته می‌شود: 191 | \[ 192 | H = I_{n-i-1} - 2 \frac{vv^T}{v^T v} 193 | \] 194 | \item ماتریس \( B \) به‌روزرسانی می‌شود: 195 | \[ 196 | B[i:m, i+1:n] = B[i:m, i+1:n] H 197 | \] 198 | 199 | \textbf{زیرماتریس \( B \)}: 200 | 201 | این عبارت به معنی این است که بخشی از ماتریس \( B \) که از سطر \( i \) تا سطر \( m-1 \) و از ستون \( i+1 \) تا ستون \( n-1 \) است، 202 | \item ماتریس \( V \) به‌روزرسانی می‌شود: 203 | \[ 204 | V[:, i+1:n] = V[:, i+1:n] H 205 | \] 206 | \pagebreak 207 | \end{itemize} 208 | \end{itemize} 209 | 210 | 211 | 212 | \subsection{تجزیه SVD به وسیله ماتریس بیدیگونال } 213 | 214 | ماتریس بیدیگونال \( B \) می‌تواند به صورت زیر تجزیه شود: 215 | \[ 216 | B = U_b \Sigma (V_b)^T 217 | \] 218 | که در اینجا: 219 | \begin{itemize} 220 | \item \( U_b \) و \( V_b \) ماتریس‌های ارتوگونال برای بردارهای ویژه چپ و راست هستند. 221 | \item \( \Sigma \) بردار وکتور ویژه‌های ماتریس بیدیگونال \( B \) است. 222 | \end{itemize} 223 | 224 | \section*{2. به‌روزرسانی ماتریس‌های ارتوگونال \( U \) و \( V \):} 225 | ماتریس‌های ارتوگونال \( U \) و \( V \) بر اساس بردارهای ویژه به‌دست آمده از SVD به‌روزرسانی می‌شوند: 226 | \[ 227 | U = U U_b 228 | \] 229 | \[ 230 | V = V V_b^T 231 | \] 232 | که این عملیات باعث به‌روزرسانی ماتریس‌های ارتوگونال \( U \) و \( V \) می‌شود. 233 | 234 | در واقغ ماتریس \( B \) که از ماتریس \( A \) بیدیگونال شده است پس از تجزیه SVD و به روز رسانی ماتریس های \( U_b \) و \( V_b \) و به دست اوردن ماتریس های \( U \) و \( V \) میتوان راطه زیر را نوشنت . 235 | 236 | 237 | \[ 238 | A = U \Sigma (V)^T 239 | \] 240 | 241 | 242 | \pagebreak 243 | 244 | \end{enumerate} 245 | 246 | 247 | --------------------------------------------------------------------------------