C#,码海拾贝(35)——求“实对称矩阵““特征值与特征向量“的“雅可比法“之C#源代码

news2024/11/22 19:41:29

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="dblEigenValue">一维数组,长度为矩阵的阶数,返回时存放特征值</param>
        /// <param name="mtxEigenVector">返回时存放特征向量矩阵,其中第i列为与数组dblEigenValue中第j个特征值对应的特征向量</param>
        /// <param name="nMaxIt">迭代次数</param>
        /// <param name="eps">计算精度</param>
        /// <returns>求解是否成功</returns>
        public static bool ComputeEvJacobi(Matrix src, out double[] dblEigenValue, out Matrix mtxEigenVector, int nMaxIt = 100, double eps = 1.0E-7)
        {
            int p = 0, q = 0, u, w, t, s;
            double fm, cn, sn, omega, x, y, d;

            int n = src.Columns;
            dblEigenValue = new double[n];
            mtxEigenVector = new Matrix(n, n);

            int k = 1;
            for (int i = 0; i < n; i++)
            {
                mtxEigenVector[i * n + i] = 1.0;
                for (int j = 0; j < n; j++)
                {
                    if (i != j)
                    {
                        mtxEigenVector[i * n + j] = 0.0;
                    }
                }
            }
            while (true)
            {
                fm = 0.0;
                for (int i = 1; i < n; i++)
                {
                    for (int j = 0; j < i; j++)
                    {
                        d = Math.Abs(src[i * n + j]);
                        if ((i != j) && (d > fm))
                        {
                            fm = d;
                            p = i;
                            q = j;
                        }
                    }
                }

                if (fm < eps)
                {
                    for (int i = 0; i < n; ++i)
                    {
                        dblEigenValue[i] = src[i, i];
                    }
                    return true;
                }

                if (k > nMaxIt)
                {
                    return false;
                }
                k = k + 1;
                u = p * n + q;
                w = p * n + p;
                t = q * n + p;
                s = q * n + q;
                x = -src[u];
                y = (src[s] - src[w]) / 2.0;
                if (Math.Abs(x) < float.Epsilon || Math.Abs(y) < float.Epsilon)
                {
                    return false;
                }
                omega = x / Math.Sqrt(x * x + y * y);

                if (y < 0.0)
                {
                    omega = -omega;
                }
                if (Math.Abs(omega - 1.0) < float.Epsilon)
                {
                    return false;
                }
                sn = 1.0 + Math.Sqrt(1.0 - omega * omega);
                if (Math.Abs(sn) < float.Epsilon)
                {
                    return false;
                }
                sn = omega / Math.Sqrt(2.0 * sn);
                if (Math.Abs(1.0 - sn) < float.Epsilon)
                {
                    return false;
                }
                cn = Math.Sqrt(1.0 - sn * sn);
                fm = src[w];
                src[w] = fm * cn * cn + src[s] * sn * sn + src[u] * omega;
                src[s] = fm * sn * sn + src[s] * cn * cn - src[u] * omega;
                src[u] = 0.0;
                src[t] = 0.0;
                for (int j = 0; j < n; j++)
                {
                    if ((j != p) && (j != q))
                    {
                        u = p * n + j; w = q * n + j;
                        fm = src[u];
                        src[u] = fm * cn + src[w] * sn;
                        src[w] = -fm * sn + src[w] * cn;
                    }
                }

                for (int i = 0; i < n; i++)
                {
                    if ((i != p) && (i != q))
                    {
                        u = i * n + p;
                        w = i * n + q;
                        fm = src[u];
                        src[u] = fm * cn + src[w] * sn;
                        src[w] = -fm * sn + src[w] * cn;
                    }
                }

                for (int i = 0; i < n; i++)
                {
                    u = i * n + p;
                    w = i * n + q;
                    fm = mtxEigenVector[u];
                    mtxEigenVector[u] = fm * cn + mtxEigenVector[w] * sn;
                    mtxEigenVector[w] = -fm * sn + mtxEigenVector[w] * cn;
                }
            }
        }
    }
}

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

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

相关文章

编码器 | 基于 Transformers 的编码器-解码器模型

基于 transformer 的编码器-解码器模型是 表征学习 和 模型架构 这两个领域多年研究成果的结晶。本文简要介绍了神经编码器-解码器模型的历史&#xff0c;更多背景知识&#xff0c;建议读者阅读由 Sebastion Ruder 撰写的这篇精彩 博文。此外&#xff0c;建议读者对 自注意力 (…

【AUTOSAR】Bootloader说明(一)---- 时序流程

电机控制器选用TI TMS28xx DSP&#xff0c;包括boot-loader与应用软件两个部分。其中boot-loader包括下列内容&#xff1a; RAM自检应用程序有效性检查UDS命令处理FLASH操作 下面分别说明DSP上电后整个软件运行流程及程序刷新过程。 DSP软件执行流程 DSP复位后&#xff0c;将…

【Mysql基础】-关于常用的函数简单案例

目录 一、系统函数 二、日期函数 三、字符串函数数 说明&#xff1a;以下所有的操作在8.0的mysql数据库操作系统上操作 一、系统函数 1 显示连接列表&#xff1a;show PROCESSLIST; 2 MD5加密&#xff1a;select MD5("root") 二、日期函数 1、 推算一周之后的…

QMI8658 - 姿态传感的零偏(常值零偏)标定

1. 零偏 理论上在静止状态下三轴输出为0,0,0&#xff0c;但实际上输出有一个小的偏置&#xff0c;这是零偏的静态分量&#xff08;也称固定零偏&#xff09;。 陀螺生产出来后就一直固定不变的零偏值。对于传统的高性能惯性器件来说&#xff0c;该误差在出厂标定时往往就被补偿…

《水经注地图服务》用户如何登录?

《水经注地图服务》&#xff08;WeServer&#xff09;是一款可快速发布全国乃至全球海量卫星影像的地图发布服务产品&#xff0c;该产品完全遵循OGC相关协议标准&#xff0c;是一个基于若干项目成功经验总结的产品。它可以轻松发布100TB级海量卫星影像&#xff0c;从而使“在内…

如何使用 Raycast 一键打开预设工作环境

工作中&#xff0c;你一定遇到过这样的场景&#xff1a;你正在认真写代码&#xff0c;线上突然出现报警。看到报警信息之后&#xff0c;你不得不打开浏览器&#xff0c;点开收藏夹&#xff0c;打开监控页面、告警页面、trace 页面、日志搜索平台……有时&#xff0c;还需要打开…

chatgpt赋能python:Python取值:了解基础知识和应用方法

Python取值&#xff1a;了解基础知识和应用方法 什么是Python取值&#xff1f; Python取值是指从一个对象中获取信息或者值。对象可以包括列表、字典、元组、变量等。Python提供了多种方法来取值&#xff0c;包括基础的索引和切片操作&#xff0c;以及高级的列表推导式、字典…

MySQL JDBC详解

文章目录 简介JDBC APIJDBC Driver ManagerJDBC 驱动 JDBC 开发步骤一&#xff0c;导入 JDBC 驱动包&#xff0c;并加载驱动类二&#xff0c;建立数据库连接三&#xff0c;发送 SQL 语句&#xff0c;并获取执行结果Statement 对象PreparedStatement 对象 四&#xff0c;处理返回…

ADAS方案的简单比较

ADAS方案的简单比较 1 概述2 厂商Tesla硬件布局网络基础结构&#xff1a;HydraNet多头网络 NVIDIA百度&#xff08;Apollo&#xff09;版本历史硬件布局软件框架各版本框架 WaymoVolvo-Uber 3 芯片4 其他from [最全自动驾驶技术架构和综述](https://blog.csdn.net/buptgshengod…

项目质量管理

质量与项目质量 质量的定义&#xff1a;一组固有特征满足要求的程序。 质量是反应实体主题明确和隐含需求的能力的特性总和 质量与等级的关系&#xff1a; 一个低等级&#xff08;功能有限&#xff09;&#xff0c;高质量&#xff08;无明显缺陷&#xff0c;用户手册易读&am…

《Datawhale南瓜书》出第二版啦!

Datawhale干货 作者&#xff1a;Datawhale开源项目团队 作为机器学习的入门经典教材&#xff0c;周志华老师的《机器学习》&#xff0c;自2016年1月底出版以来&#xff0c;首印5000册一周售罄&#xff0c;并在8个月内重印9次。先后登上了亚马逊&#xff0c;京东&#xff0c;当…

【运维知识进阶篇】iptables防火墙详解

这篇文章给大家介绍下iptables防火墙&#xff0c;防火墙大致分三种&#xff0c;分别是硬件、软件和云防火墙。硬件的话部署在企业网络的入口&#xff0c;有三层路由的H3C、华为、Cisco&#xff08;思科&#xff09;&#xff0c;还有深信服等等&#xff1b;软件的话一般是开源软…

【服务器】iPad远程服务器进行开发

文章目录 前言1. 本地环境配置2. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.2 创建HTTP隧道 3. 测试远程访问4. 配置固定二级子域名4.1 保留二级子域名4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问6. iPad通过软件远程vscode6.1 创建TCP隧道 7. ipad远…

人工智能 AI | ChatGPT 时代,程序员的生存之道

ChatGPT 近期炙手可热&#xff0c;仿佛没有什么问题是它不能解决的。出于对 ChatGPT 的好奇&#xff0c;我们决定探索下它对于前端开发人员来讲&#xff0c;是作为辅助工具多一些&#xff0c;还是主力工具更多一些&#xff1f; 2D 能力测试 我们就挑选一个著名的递归回溯问题—…

代码随想录算法训练营第三十九天|62.不同路径|63. 不同路径 II

LeetCode62.不同路径 动态规划五部曲&#xff1a; 1&#xff0c;确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i][j] &#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#xff0c;到(i, j) 有dp[i][j]条不同的路径。 2&#xff0c…

cpu飚高的排查思路

cpu的衡量指标 使用率util&#xff1a;代表的是单位时间内CPU繁忙情况的统计。操作系统对cpu的管理就是利用周期的tick时钟中断&#xff0c;将cpu的使用划分时间片。每个时间片内去执行不同进程/线程里的代码。所以cpu的使用率统计其实也是以tick为单位的&#xff1a;统计周期…

开源代码分享(1)—考虑经济性的储能运行优化

参考文献&#xff1a; [1]Practical operation strategies for pumped hydroelectric energy storage (PHES) utilising electricity price arbitrage - ScienceDirect [2]Towards an objective method to compare energy storage technologies: development and validation of…

Python——Flask快速开发一个物资管理平台(源码+适合大作业)

目录 一、前言 二、项目展示 三、代码包 四、项目简介 五、运行步骤 一、前言 Flask 框架结合原生的 HTML 和 Bootstrap 可以快速开发 Web 应用程序。 Flask 框架是 Python 中一个轻量级的 Web 应用框架&#xff0c;它非常适合构建小型项目和原型化开发。Flask 框架具有可扩展的…

K8S利用nginx快速部署一个网站之基本概念(十)

在Kubernetes部署应用程序流程 使用Deployment控制器部署镜像&#xff1a; kubectl create deployment web --imagenginx --replicas3 kubectl get deploy,pods 使用Service将Pod暴露出去&#xff1a; kubectl expose deployment web --port80 --target-port80 --typeNodePor…

Pyside6-第六篇-各按钮的信号与槽

今天是Pyside6的第六篇内容。一起来看看各按钮的信号与槽。 from PySide6.QtCore import Qt from PySide6.QtGui import QAction from PySide6.QtWidgets import QApplication, QWidget, QRadioButton, \QPushButton, QCheckBox, QToolButton, QMenuclass Example(QWidget):def…