C#——Dictionary<TKey, TValue> 计算向量的余弦值

说明:三角函数的余弦值Cos我想,每个学计算机的理工人都知道,但是真的明白它的用途,我也是刚明白。每个人在初中或者高中的时候,都有这么个疑惑,学三角函数干什么用的?很直白的答案就是考试用的。而且当时的老师只管教,只管怎么解题,至于将学习的知识运用到生活中,没有这门课堂。最终的结果却是,我们只知道学,不知道用。说来也惭愧啊,我也是看了吴军博士的《数学之美》,才领悟到的。这本书真的给我很多的启发。

Cos的用途:

  1. 考试用。
  2. 通过计算2个向量,可以知道他们的相似度。余弦值越小,则2个向量越垂直,余弦值越接近1,则这个向量就越平行(相似)。这样,我们就可以将向量抽象为事物的特征集合了。计算向量的余弦值,就可以判断事物的相似度。至于详细的运用领域,还是读读这本书吧。

代码中的Cosine.cs是我很早从网上搜到的,地址也忘了。

计算代码如下:

Cosine.cs类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Cosine
    {
        /// <summary>
        /// 计算向量余弦值
        /// </summary>
        /// <param name="vector1"></param>
        /// <param name="vector2"></param>
        public static double Calculate(Dictionary<int, double> vector1, Dictionary<int, double> vector2)
        {
            double dotProduct = CalcDotProduct(vector1, vector2);
            double length1 = CalcLength(vector1);
            double length2 = CalcLength(vector2);
            double cosine = dotProduct / (length1 * length2);
            return cosine;
        }
        /// <summary>
        /// 计算向量长度(vector length)
        /// </summary>
        /// <param name="vector"></param>
        /// <returns></returns>
        private static double CalcLength(Dictionary<int, double> vector)
        {
            double length = 0;
            foreach (KeyValuePair<int, double> kvp in vector)
            {
                length += Math.Pow(kvp.Value, 2);
            }
            return Math.Sqrt(length);
        }

        /// <summary>
        /// 计算向量点积(dot product)/内积(inner product)
        /// </summary>
        /// <param name="vector1"></param>
        /// <param name="vector2"></param>
        /// <returns></returns>
        private static double CalcDotProduct(Dictionary<int, double> vector1, Dictionary<int, double> vector2)
        {
            double dotProduct = 0;
            foreach (KeyValuePair<int, double> kvp in vector1)
            {
                if (vector2.ContainsKey(kvp.Key))
                {
                    dotProduct += kvp.Value * vector2[kvp.Key];
                }
            }
            return dotProduct;
        }
    }
}

Program类,是我的,嘿嘿。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        //自定义输入函数
        static void FunInput(Dictionary<int, double> Vector, int num)
        {
            for (int i = 0; i < num; i++)
            {
                Vector.Add(i, double.Parse(Console.ReadLine()));
            }
        }

        //自定义输出函数
        static void FunOutput(Dictionary<int, double> Vector)
        {
            //使用KeyValuePair输出
            foreach (KeyValuePair<int, double> number in Vector)
            {
                Console.WriteLine("{0}---{1}", number.Key, number.Value);
            }
        }

        static void Main(string[] args)
        {
            Dictionary<int, double> Vector1 = new Dictionary<int,double>();
            Dictionary<int, double> Vector2 = new Dictionary<int,double>();

            Console.WriteLine("这2个向量的维度数必须相同,请输入维度数值:");
            int num = int.Parse(Console.ReadLine());//字符串转化为整形

            Console.WriteLine("请输入Vector1向量的{0}个数值(每行一个):",num);
            FunInput(Vector1, num);
            //FunOutput(Vector1);

            Console.WriteLine("请输入Vector2向量的{0}个数值(每行一个):", num);
            FunInput(Vector2, num);
            //FunOutput(Vector2);
            Console.WriteLine("Vector1和Vector2的余弦值是:{0}",Cosine.Calculate(Vector1,Vector2));
        }
    }
}
时间: 2024-10-11 05:06:33

C#——Dictionary<TKey, TValue> 计算向量的余弦值的相关文章

C#高级编程五十三天----字典Dictionary&lt;TKey,TValue&gt;

字典 关键字:Dicitionary 说明: 必须包含命名空间System.Collection.Generic Dictionary里面的每一个元素都是一个键值对(由两个元组组成:键和值). 键必须是唯一的,而值不需要唯一的. 键和值都可以是任意类型(例如:string,int,自定义类型,等等) 通过一个键读取一个值的事件是接近O(1) 键值对之间的偏序可以不定义 使用案例: using System; using System.Collections.Generic; using Syst

C#编程(五十三)----------字典Dictionary&lt;TKey,TValue&gt;

字典 关键字:Dicitionary 说明: 必须包含命名空间System.Collection.Generic Dictionary里面的每一个元素都是一个键值对(由两个元组组成:键和值). 键必须是唯一的,而值不需要唯一的. 键和值都可以是任意类型(例如:string,int,自定义类型,等等) 通过一个键读取一个值的事件是接近O(1) 键值对之间的偏序可以不定义 使用案例: using System; using System.Collections.Generic; using Syst

.net源码分析 – Dictionary&lt;TKey, TValue&gt;

接上篇:.net源码分析 – List<T> Dictionary<TKey, TValue>源码地址:https://github.com/dotnet/corefx/blob/master/src/System.Collections/src/System/Collections/Generic/Dictionary.cs 接口 Dictionary<TKey, TValue>和List<T>的接口形式差不多,不重复说了,可以参考List<T>

Dictionary&lt;TKey, TValue&gt; 类

C# Dictionary<TKey, TValue> 类 Dictionary<TKey, TValue> 泛型类提供了从一组键到一组值的映射.字典中的每个添加项都由一个值及其相关联的键组成.通过key检索值的速度非常快,其时间复杂度为常数阶 O(1),因为 Dictionary<TKey, TValue> 类是以哈希表的方式实现的. 只要对象用作键在 Dictionary<TKey, TValue>,不得更改任何会影响其哈希值的方式.每个在 Dictio

.NET中Dictionary&lt;TKey, TValue&gt;浅析

.NET中Dictionary<TKey, Tvalue>是非常常用的key-value的数据结构,也就是其实就是传说中的哈希表..NET中还有一个叫做Hashtable的类型,两个类型都是哈希表.这两个类型都可以实现键值对存储的功能,区别就是一个是泛型一个不是并且内部实现有一些不同.今天就研究一下.NET中的Dictionary<TKey, TValue>以及一些相关问题. guid:33b4b911-2068-4513-9d98-31b2dab4f70c 文中如有错误,望指出.

c# 扩展方法奇思妙用基础篇五:Dictionary&lt;TKey, TValue&gt; 扩展

Dictionary<TKey, TValue>类是常用的一个基础类,但用起来有时确不是很方便.本文逐一讨论,并使用扩展方法解决. 向字典中添加键和值 添加键和值使用 Add 方法,但很多时候,我们是不敢轻易添加的,因为 Dictionary<TKey, TValue>不允许重复,尝试添加重复的键时 Add 方法引发 ArgumentException. 大多时候,我们都会写成以下的样子: var dict = new Dictionary<int, string>()

自定义一个可以被序列化的泛型Dictionary&lt;TKey,TValue&gt;集合

Dictionary是一个键值类型的集合.它有点像数组,但Dictionary的键可以是任何类型,内部使用Hash Table存储键和值.本篇自定义一个类型安全的泛型Dictionary<TKey, TValue>,并且可以被序列化. 为了使自定义的泛型Dictionary<TKey, TValue>可以被序列化成xml,需要实现泛型IXmlSerializable接口. public class MySerializableDictionary<TKey, TValue&g

C#中数组、集合(ArrayList)、泛型集合List&lt;T&gt;、字典(dictionary&lt;TKey,TValue&gt;)全面对比

为什么把这4个东西放在一起来说,因为c#中的这4个对象都是用来存储数据的集合--. 首先咱们把这4个对象都声明并实例化一下: //数组 string[] m_Str = new string[5]; //集合 ArrayList m_AList = new ArrayList(); //泛型集合 List<int> m_List = new List<int>(); //字典 Dictionary<int, string> m_Dt = new Dictionary&l

关于C#中 List&lt;T&gt; 和 Dictionary&lt;TKey, TValue&gt;组织数据效率和查询数据效率的比较。

最近我接受到一个工作任务,大致是做个通用的数据接口,供业务人员调用,要求返回前台所有的字段中文说明和字段对应的单位说明. 于是乎,我就定义了一个结构体: public class FieldInfo { public string FieldCode = string.Empty;//数据库字段 public string FieldName = string.Empty;//字段对应的中文说明 public string FieldUnit = string.Empty;//字段对应的单位说明