C#——Dictionary<TKey, TValue> 计算向量的余弦值
说明:三角函数的余弦值Cos我想,每个学计算机的理工人都知道,但是真的明白它的用途,我也是刚明白。每个人在初中或者高中的时候,都有这么个疑惑,学三角函数干什么用的?很直白的答案就是考试用的。而且当时的老师只管教,只管怎么解题,至于将学习的知识运用到生活中,没有这门课堂。最终的结果却是,我们只知道学,不知道用。说来也惭愧啊,我也是看了吴军博士的《数学之美》,才领悟到的。这本书真的给我很多的启发。
Cos的用途:
- 考试用。
- 通过计算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 = ;
foreach (KeyValuePair<int, double> kvp in vector)
{
length += Math.Pow(kvp.Value, );
}
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 = ;
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 = ; 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));
}
}
}
C#——Dictionary<TKey, TValue> 计算向量的余弦值的更多相关文章
- C#编程(五十三)----------字典Dictionary<TKey,TValue>
字典 关键字:Dicitionary 说明: 必须包含命名空间System.Collection.Generic Dictionary里面的每一个元素都是一个键值对(由两个元组组成:键和值). 键必须 ...
- .net源码分析 – Dictionary<TKey, TValue>
接上篇:.net源码分析 – List<T> Dictionary<TKey, TValue>源码地址:https://github.com/dotnet/corefx/blo ...
- .NET中Dictionary<TKey, TValue>浅析
.NET中Dictionary<TKey, Tvalue>是非常常用的key-value的数据结构,也就是其实就是传说中的哈希表..NET中还有一个叫做Hashtable的类型,两个类型都 ...
- Dictionary<TKey, TValue> 类
C# Dictionary<TKey, TValue> 类 Dictionary<TKey, TValue> 泛型类提供了从一组键到一组值的映射.字典中的每个添加项都由一个值及 ...
- C# 字典 Dictionary<Tkey,Tvalue>
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来.我们都知道计算机技术发展日新月异,速度惊人的快,你我稍不留神,就会被慢慢淘汰!因此:每日不间断的学习是避免被 ...
- 巧用Dictionary<TKey,TValue>,完成客户需求
前几天与客户沟通一个项目,客户对其中某个模块提了一个需求. 把从数据库中取出的对物品的统计重新拆分重新统计.鉴于用文字不能清除的表达需求,我将该需求画出来,便于理解. 需求如下图: 就是A,B,C D ...
- C# .Net 中字典Dictionary<TKey,TValue>泛型类 学习浅谈
一.综述: Dictionary<TKey,TValue>是在 .NET Framework 2.0 版中是新增的.表示键值对的集合,Dictionary<TKey,TValue&g ...
- 自定义一个可以被序列化的泛型Dictionary<TKey,TValue>集合
Dictionary是一个键值类型的集合.它有点像数组,但Dictionary的键可以是任何类型,内部使用Hash Table存储键和值.本篇自定义一个类型安全的泛型Dictionary<TKe ...
- 使用结构struct作为Dictionary<TKey,TValue>的键
我们经常用简单数据类型,比如int作为泛型Dictionary<TKey,TValue>的key,但有时候我们希望自定义数据类型作为Dictionary<TKey,TValue> ...
随机推荐
- jstl格式化数字
jstl中的<fmt:formatNumber>标签 设置显示时间戳<% request.setAttribute("currentTimeStamp" ...
- 【python】密码生成器
#!/usr/bin/env python#-*- coding:UTF-8 -*- import random #导入random模块import string #导入string模块 sal ...
- 把 TBytes 转换为十六进制字符串
function BytestoHexString(ABytes: TBytes; len: Integer): AnsiString; begin SetLength(Result, len*) ...
- JQuery Mobile 页面参数传递(转)
在单页模版中使用基于HTTP的方式通过POST和GET请求传递参数,而在多页模版中不需要与服务器进行通信,通常在多页模版中有以下三种方法来实现页面间的参数传递. 1.GET方式:在前一个页面生成参数并 ...
- A 浪哥的烦恼 完全背包dp
https://biancheng.love/contest-ng/index.html#/131/problems 首先,去到n点的最小时间是所有数加起来. 然后,如果我1 --- 2,然后再2-- ...
- 各种 starter poms (启动器)
starter包含了搭建项目,快速运行所需的依赖.它是一个依赖关系描述符的集合.当应用需要一种spring的服务时,不需要粘贴拷贝大量的依赖关系描述符.例如想在spring中使用redis,只需要在项 ...
- hdu 2669 Romantic (乘法逆元)
Romantic Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- Java中的转义字符
1.转义字符 1.八进制转义序列:\ + 1到3位5数字:范围'\000'~'\377' \0:空字符 2.Unicode转义字符:\u + 四个十六进制数字:0~65535 \u ...
- hdu 4268 Alice and Bob
Alice and Bob Time Limit : 10000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Tota ...
- 在指定控件位置弹出popup window
先看效果图 黄色的就是弹出的popup window 首先自定义一个view用来显示,文件名为layout_my_view.xml <?xml version="1.0" e ...