当前位置: 首页 > news >正文

c# 线性代数 克·施密特(Gram Schmidt)

        Gram-Schmidt 方法是一种用于将线性无关的向量集合转化为一组正交(垂直)的向量集合的数学技术。这个方法是在线性代数中常用的一种技术,用于处理向量空间中的正交化和标准化操作。Gram-Schmidt 方法的主要思想是,通过一系列的投影和减法操作,将原始向量集合转化为一个正交化的向量集合。

在 C# 中,Gram-Schmidt 方法可以通过以下步骤实现:

  1. 对于给定的向量集合,首先将每个向量进行标准化,即将每个向量除以其模长,使其成为单位向量。
  2. 从第一个向量开始,依次处理每个向量。对于每个后续的向量,都进行投影操作,将其投影到前面已经处理过的向量上并将投影部分减去,以确保正交性。
  3. 重复以上步骤直到处理完所有向量,最终得到一组正交化的向量集合。

        通过 Gram-Schmidt 方法的正交化过程,我们可以获得一组正交向量,这些向量在线性空间中相互垂直,可以更好地描述和分析向量集合的性质。

        在实际编程中,可以创建一个 Vector 类来表示向量,实现标准化、点积、投影等基本操作,并编写一个 GramSchmidt 方法来实现 Gram-Schmidt 正交化过程。这样就可以对给定的向量集合进行正交化处理,以便后续的线性代数运算和分析。

Gram-Schmidt 正交化方法的示例一:

using System;

class Program
{
    static void Main()
    {
        double[][] vectors = {
            new double[] {1, 1, 0},
            new double[] {1, -1, 0},
            new double[] {0, 0, 2}
        };

        double[][] orthogonalizedVectors = GramSchmidt(vectors);

        Console.WriteLine("Orthogonalized Vectors:");
        foreach (var vector in orthogonalizedVectors)
        {
            Console.WriteLine(string.Join(", ", vector));
        }
    }

    static double DotProduct(double[] v1, double[] v2)
    {
        double result = 0;
        for (int i = 0; i < v1.Length; i++)
        {
            result += v1[i] * v2[i];
        }
        return result;
    }

    static double[] Subtract(double[] v1, double[] v2)
    {
        double[] result = new double[v1.Length];
        for (int i = 0; i < v1.Length; i++)
        {
            result[i] = v1[i] - v2[i];
        }
        return result;
    }

    static double[] Normalize(double[] vector)
    {
        double magnitude = Math.Sqrt(DotProduct(vector, vector));
        double[] normalized = new double[vector.Length];
        for (int i = 0; i < vector.Length; i++)
        {
            normalized[i] = vector[i] / magnitude;
        }
        return normalized;
    }

    static double[][] GramSchmidt(double[][] vectors)
    {
        int n = vectors.Length;
        int m = vectors[0].Length;
        double[][] u = new double[n][];
        double[][] e = new double[n][];

        for (int i = 0; i < n; i++)
        {
            u[i] = new double[m];
            e[i] = new double[m];
            Array.Copy(vectors[i], u[i], m);
            for (int j = 0; j < i; j++)
            {
                double projection = DotProduct(vectors[i], e[j]);
                for (int k = 0; k < m; k++)
                {
                    u[i][k] -= projection * e[j][k];
                }
            }
            e[i] = Normalize(u[i]);
        }

        return e;
    }
}

Gram-Schmidt 正交化方法示例二:

using System;
using System.Collections.Generic;

class Vector
{
    public double[] Components { get; set; }

    public Vector(params double[] components)
    {
        Components = components;
    }

    public double Magnitude()
    {
        double sum = 0;
        foreach (var component in Components)
        {
            sum += Math.Pow(component, 2);
        }
        return Math.Sqrt(sum);
    }

    public Vector Normalize()
    {
        double magnitude = Magnitude();
        double[] normalizedComponents = new double[Components.Length];
        for (int i = 0; i < Components.Length; i++)
        {
            normalizedComponents[i] = Components[i] / magnitude;
        }
        return new Vector(normalizedComponents);
    }

    public static double DotProduct(Vector v1, Vector v2)
    {
        double result = 0;
        for (int i = 0; i < v1.Components.Length; i++)
        {
            result += v1.Components[i] * v2.Components[i];
        }
        return result;
    }

    public static Vector Subtract(Vector v1, Vector v2)
    {
        double[] resultComponents = new double[v1.Components.Length];
        for (int i = 0; i < v1.Components.Length; i++)
        {
            resultComponents[i] = v1.Components[i] - v2.Components[i];
        }
        return new Vector(resultComponents);
    }
}

class Program
{
    static void Main()
    {
        Vector[] vectors = {
            new Vector(1, 1, 0),
            new Vector(1, -1, 0),
            new Vector(0, 0, 2)
        };

        List<Vector> orthogonalizedVectors = new List<Vector>();
        
        foreach (var vector in vectors)
        {
            Vector orthogonalizedVector = vector;
            foreach (var existingVector in orthogonalizedVectors)
            {
                Vector projection = Vector.Normalize(existingVector) * Vector.DotProduct(vector, existingVector);
                orthogonalizedVector = Vector.Subtract(orthogonalizedVector, projection);
            }
            orthogonalizedVectors.Add(Vector.Normalize(orthogonalizedVector));
        }
        
        Console.WriteLine("Orthogonalized Vectors:");
        foreach (var vector in orthogonalizedVectors)
        {
            Console.WriteLine(string.Join(", ", vector.Components));
        }
    }
}

        在上面两个示例中,我们实现了 Gram-Schmidt 方法来将给定的向量集合进行正交化处理,并输出正交向量组。您可以根据需要对该代码进行修改和扩展。

相关文章:

  • Qt C++春晚刘谦魔术约瑟夫环问题的模拟程序
  • vue3+element Plus+ts 自定义主题色,以及生成主题色各种透明度
  • 【Docker】基于yum安装docker
  • uniapp富文本文字长按选中(用于复制,兼容H5、APP、小程序三端)
  • 代码随想录算法训练营|day32
  • MySQL篇—事务和隔离级别介绍
  • CTFHub技能树web之RCE(二)
  • 【LeetCode】递归精选8题——基础递归、链表递归
  • Android | ArcGIS入门
  • FreeRTOS学习笔记——(FreeRTOS临界段代码保护及调度器挂起与恢复)
  • C#,洗牌问题(Card Shuffle Problem)的算法与源代码
  • 解决element UI中el-select选择器比el-input输入框默认宽度小
  • Hive数据仓库行转列
  • 爬虫基本库的使用(urllib库的详细解析)
  • uniapp上传文件到腾讯云
  •  D - 粉碎叛乱F - 其他起义
  • ES学习笔记(12)--Symbol
  • Git学习与使用心得(1)—— 初始化
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • java8 Stream Pipelines 浅析
  • Javascript编码规范
  • mac修复ab及siege安装
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • npx命令介绍
  • spring security oauth2 password授权模式
  • Transformer-XL: Unleashing the Potential of Attention Models
  • Vue官网教程学习过程中值得记录的一些事情
  • 半理解系列--Promise的进化史
  • 复习Javascript专题(四):js中的深浅拷贝
  • 缓存与缓冲
  • 码农张的Bug人生 - 见面之礼
  • 前端性能优化--懒加载和预加载
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 入门到放弃node系列之Hello Word篇
  • 数据结构java版之冒泡排序及优化
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 算法---两个栈实现一个队列
  • 微信开源mars源码分析1—上层samples分析
  • 为视图添加丝滑的水波纹
  • 我的zsh配置, 2019最新方案
  • 写给高年级小学生看的《Bash 指南》
  • 译有关态射的一切
  • Semaphore
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (ibm)Java 语言的 XPath API
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (十)T检验-第一部分
  • (算法二)滑动窗口
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • *Django中的Ajax 纯js的书写样式1
  • .bat批处理(十一):替换字符串中包含百分号%的子串