C#,码海拾贝(32)——计算“实对称三对角阵的全部特征值与特征向量的”之C#源代码

news2024/11/22 16:29:19

using System;

namespace Zhou.CSharp.Algorithm
{
    /// <summary>
    /// 矩阵类
    /// 作者:周长发
    /// 改进:深度混淆
    /// https://blog.csdn.net/beijinghorn
    /// </summary>
    public partial class Matrix
    {
        /// <summary>
        /// 实对称三对角阵的全部特征值与特征向量的计算
        /// </summary>
        /// <param name="src">源矩阵</param>
        /// <param name="dblB">一维数组,长度为矩阵的阶数,传入对称三对角阵的主对角线元素;返回时存放全部特征值。</param>
        /// <param name="dblC">一维数组,长度为矩阵的阶数,前n-1个元素传入对称三对角阵的次对角线元素</param>
        /// <param name="mtxQ">如果传入单位矩阵,则返回实对称三对角阵的特征值向量矩阵;如果传入MakeSymTri函数求得的矩阵A的豪斯荷尔德变换的乘积矩阵Q,则返回矩阵A的特征值向量矩阵。其中第i列为与数组dblB中第j个特征值对应的特征向量。</param>
        /// <param name="nMaxIt">迭代次数</param>
        /// <param name="eps">计算精度</param>
        /// <returns>求解是否成功</returns>
        public static bool ComputeEvSymTri(Matrix src, double[] dblB, double[] dblC, Matrix mtxQ, int nMaxIt, double eps)
        {
            int i, j, k, m, it, u, v;
            double d, f, h, g, p, r, e, s;

            // 初值
            int n = mtxQ.GetNumColumns();
            dblC[n - 1] = 0.0;
            d = 0.0;
            f = 0.0;

            // 迭代计算

            for (j = 0; j <= n - 1; j++)
            {
                it = 0;
                h = eps * (Math.Abs(dblB[j]) + Math.Abs(dblC[j]));
                if (h > d)
                {
                    d = h;
                }
                m = j;
                while ((m <= n - 1) && (Math.Abs(dblC[m]) > d))
                {
                    m = m + 1;
                }
                if (m != j)
                {
                    do
                    {
                        if (it == nMaxIt)
                        {
                            return false;
                        }
                        it = it + 1;
                        g = dblB[j];
                        p = (dblB[j + 1] - g) / (2.0 * dblC[j]);
                        r = Math.Sqrt(p * p + 1.0);
                        if (p >= 0.0)
                        {
                            dblB[j] = dblC[j] / (p + r);
                        }
                        else
                        {
                            dblB[j] = dblC[j] / (p - r);
                        }
                        h = g - dblB[j];
                        for (i = j + 1; i <= n - 1; i++)
                        {
                            dblB[i] = dblB[i] - h;
                        }
                        f = f + h;
                        p = dblB[m];
                        e = 1.0;
                        s = 0.0;
                        for (i = m - 1; i >= j; i--)
                        {
                            g = e * dblC[i];
                            h = e * p;
                            if (Math.Abs(p) >= Math.Abs(dblC[i]))
                            {
                                e = dblC[i] / p;
                                r = Math.Sqrt(e * e + 1.0);
                                dblC[i + 1] = s * p * r;
                                s = e / r;
                                e = 1.0 / r;
                            }
                            else
                            {
                                e = p / dblC[i];
                                r = Math.Sqrt(e * e + 1.0);
                                dblC[i + 1] = s * dblC[i] * r;
                                s = 1.0 / r;
                                e = e / r;
                            }

                            p = e * dblB[i] - s * g;
                            dblB[i + 1] = h + s * (e * g + s * dblB[i]);
                            for (k = 0; k <= n - 1; k++)
                            {
                                u = k * n + i + 1;
                                v = u - 1;
                                h = mtxQ[u];
                                mtxQ[u] = s * mtxQ[v] + e * h;
                                mtxQ[v] = e * mtxQ[v] - s * h;
                            }
                        }

                        dblC[j] = s * p;
                        dblB[j] = e * p;

                    } while (Math.Abs(dblC[j]) > d);
                }

                dblB[j] = dblB[j] + f;
            }

            for (i = 0; i <= n - 1; i++)
            {
                k = i;
                p = dblB[i];
                if (i + 1 <= n - 1)
                {
                    j = i + 1;
                    while ((j <= n - 1) && (dblB[j] <= p))
                    {
                        k = j;
                        p = dblB[j];
                        j = j + 1;
                    }
                }

                if (k != i)
                {
                    dblB[k] = dblB[i];
                    dblB[i] = p;
                    for (j = 0; j <= n - 1; j++)
                    {
                        u = j * n + i;
                        v = j * n + k;
                        p = mtxQ[u];
                        mtxQ[u] = mtxQ[v];
                        mtxQ[v] = p;
                    }
                }
            }

            return true;
        }
 

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/618601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第⑩讲:Ceph集群CephFS文件存储核心概念及部署使用

文章目录 1.CephFS文件存储核心概念1.1.CephFS文件存储简介1.2.CephFS文件存储架构1.3.CephFS文件系统的应用场景与特性 2.在Ceph集群中部署MDS组件3.在Ceph集群中创建一个CephFS文件存储系统3.1.为CephFS文件存储系统创建Pool资源池3.2.创建CephFS文件系统3.3.再次观察Ceph集群…

chatgpt赋能python:从后到前查找Python字符串

从后到前查找Python字符串 Python是一种流行的编程语言&#xff0c;广泛用于Web开发、数据科学和算法设计等领域。其中&#xff0c;字符串是Python编程中的重要概念之一&#xff0c;它不仅可以表示文本&#xff0c;还可以进行各种处理。本篇文章将介绍Python字符串从后到前的查…

chatgpt赋能python:Python如何运行最方便

Python 如何运行最方便 Python 是一种高级编程语言&#xff0c;被广泛使用于各类领域。由于其简单易学&#xff0c;可读性高&#xff0c;适用于不同平台的特性&#xff0c;Python 已成为计算领域、Web 开发、数据分析等领域的首选语言之一。如果您正在学习 Python 或需要对其进…

【SQL】Oracle数据库安装并实现远程访问

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

RTL8380MI/RTL8382MI管理型交换机系统软件操作指南六:RSTP/快速生成树协议

对RSTP/快速生成树协议进行详细的描述&#xff0c;主要包括以下内容&#xff1a;STP概述、RSTP介绍、全局配置、端口配置、RSTP信息、端口信息. 1.1 STP概述 STP&#xff08;Spanning Tree Protocol&#xff09;是生成树协议的英文缩写。STP协议中定义了根桥&#xff08;RootB…

报表生成器FastReport .Net用户指南:显示数据列、HTML标签

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。 FastReport.NET官方版…

『 前端三剑客 』:HTML常用标签

HTML中常用标签 HTML中常用标签一 . 认识HTML标签二 . HTML标签介绍三 . 案例应用 一 . 认识HTML标签 在HTML中标签是以成对的结构出现的,在HTML当中代码是通过标签来组织的 , 下面通过见得的Hello World的展现来显示歘HTML 标签的结构 <html><head></head>…

mac使用anaconda安装人声分离开源工具spleeter

0. 以下为一步步自己摸索的成功安装过程 1. 安装 spleeter 注&#xff1a;anaconda 的虚拟环境 conda install spleeter太慢 pip install spleeter下载卡住 (tensorflow) Robin-macbook-pro:~ robin$ pip install spleeter Collecting spleeterWARNING: Retrying (Retry(t…

伺服电机的刚性和惯量如何理解

要说刚性&#xff0c;先说刚度。 刚度是指材料或结构在受力时抵抗弹性变形的能力&#xff0c;是材料或结构弹性变形难易程度的表征。 材料的刚度通常用弹性模量E来衡量。在宏观弹性范围内&#xff0c;刚度是零件荷载与位移成正比的比例系数&#xff0c;即引起单位位移所需的力…

OpenAI 领导层建议成立人工智能国际监管组织

人工智能的发展非常迅速&#xff0c;其潜在风险也变得越来越明显&#xff0c;为此&#xff0c;OpenAI的领导层认为&#xff0c;世界需要一个类似于核能监管机构的国际人工智能监管机构--要尽快建立&#xff0c;但也不能操之过急。 在该公司的一篇博文中(https://openai.com/blo…

javaScript蓝桥杯----图⽚⽔印⽣成

目录 一、介绍二、准备三、⽬标四、代码五、完成 一、介绍 很多⽹站都会通过给图⽚添加⽔印的形式来标记图⽚来源&#xff0c;维护版权。前端⽣成⽔印通常是通过canvas 实现&#xff0c;但实际上我们也可以直接利⽤ CSS 来实现图⽚⽔印&#xff0c;这样做会有更好的浏览器兼容…

全球前十!小米积极推动5G标准制定,科技引领高速发展

5G是推动人类社会数字化转型升级的关键支撑&#xff0c;为打造全移动和全连接的智能社会提供技术基础&#xff0c;巨大且深刻地改变着我们的生活。 近日&#xff0c;中国信息通信研究院发布了《全球5G标准必要专利及标准提案研究报告&#xff08;2023年&#xff09;》&#xff…

【新版】系统架构设计师 - 纲要章节汇总

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 随时更新&#xff0c;请持续关注 … \color{#FF7D00}随时更新&#xff0c;请持续关注… 随时更新&#xff0c;请持续关注… 文章目录 上午题 - 综合知识计算机公共基础知识架构核心知识新增技术知识知识点地图 下午…

免费的配音软件--- tts-vue 软件 下载安装过程

视频效果 tts-vue 软件 图片效果 软件包含有; 语言: 高棉语(柬埔寨) 马耳他语(马耳他) 马来语(马来西亚) 马拉雅拉姆语(印度) 马拉地语(印度) 马其顿语(北马其顿) 韩语(韩国) 阿拉伯语(黎巴嫩) 阿拉伯语(阿昙) 阿拉伯语(阿拉伯联合酋长国) 阿拉伯语(阿尔及利亚) 阿拉伯语(约…

高速信号处理卡 光纤接入卡 设计方案: 519-基于ZU19EG的4路100G光纤的PCIe 加速计算卡

519-基于ZU19EG的4路100G光纤的PCIe 加速计算卡 一、板卡概述 本板卡系我司自主设计研发&#xff0c;基于Xilinx公司Zynq UltraScale MPSOC系列SOC XCZU19EG-FFVC1760架构&#xff0c;支持PCIE Gen3x16模式。其中&#xff0c;ARM端搭载一组64-bit DDR4&#xff0c;总容…

Vue.js 中的 $emit 和 $on 方法有什么区别?

Vue.js 中的 $emit 和 $on 方法有什么区别&#xff1f; 在 Vue.js 中&#xff0c;$emit 和 $on 方法是两个常用的方法&#xff0c;用于实现组件间的通信。它们可以让我们在一个组件中触发一个自定义事件&#xff0c;并在另一个组件中监听这个事件&#xff0c;从而实现组件间的…

【AI实战】大语言模型(LLM)有多强?还需要做传统NLP任务吗(分词、词性标注、NER、情感分类、知识图谱、多伦对话管理等)

【AI实战】大语言模型&#xff08;LLM&#xff09;有多强&#xff1f;还需要做传统NLP任务吗&#xff08;分词、词性标注、NER、情感分类、多伦对话管理等&#xff09; 大语言模型大语言模型有多强&#xff1f;分词词性标注NER情感分类多伦对话管理知识图谱 总结 大语言模型 大…

PIC16F18877学习(一)

为什么要在PIC控制器中使用#pragma configs 这些设置位于程序代码之外的闪存中。 PIC一通电&#xff0c;它们就可用了&#xff0c;无论它们写在代码的哪个位置。这很重要&#xff0c;因为有时在执行程序之前需要它们。例如&#xff0c;有一些设置可以选择时钟源&#xff0c;并…

Docker 安装 Jenkins 并部署 Maven 项目

一、前言 在开始之前&#xff0c;我们需要保证系统中已经安装了Docker、JDK、Maven。 二、Docker 拉取镜像 我这里使用的是 2.344 版本的 Jenkins&#xff0c;拉取命令如下&#xff1a; docker pull jenkins/jenkins:2.344需要稍微等一会&#xff0c;等待拉取完成。 镜像下载…

GIT码云SSH公钥配置

前言&#xff1a;当你想要从Git码云上克隆或推送代码时&#xff0c;需要进行身份验证。为了进行身份验证&#xff0c;Git码云使用SSH协议&#xff0c;其中包含一个公钥和一个私钥。公钥存储在你的计算机上&#xff0c;并与你的Git码云账户相关联。私钥则必须保密&#xff0c;只…