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> ...
随机推荐
- redis3.0.5集群部署安装详细步骤
Redis集群部署文档(centos6系统) (要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下) ...
- 深入理解js——继承
JavaScript中继承是通过原型链来体现的. function Foo(){} var f1=new Foo(); f1.a=10; Foo.prototype.a=100; Foo.protot ...
- mac安装Mysql官方示例数据库employee
1. 下载地址 https://launchpad.net/test-db/employees-db-1/1.0.6 2. 执行命令 /usr/local/mysql/bin/mysql -t -u ...
- MySQL里的wait_timeout
如果你没有修改过MySQL的配置,缺省情况下,wait_timeout的初始值是28800. wait_timeout过大有弊端,其体现就是MySQL里大量的SLEEP进程无法及时释放,拖累系统性能, ...
- Linux网络编程-SIGPIPE信号导致的程序退出问题
当客户端close关闭连接时,若server端接着发送数据,根据TCP协议的规定,server端会收到RST响应,当server端再次往客户端发送数据时,系统会发出一个SIGPIPE信号给server ...
- mysql处理字符串
1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例:select left(content,200) as abstract from my_con ...
- STS 代码提示快捷键 和 注解提示的修改
window->Preferences window->Preferences
- poj 2551 Ones
本题的想法很简单,就是模拟手算乘法.不一样的是,需要控制输出的结果:每一位都是由1构成的整数. 代码如下: #include <iostream> using namespace std; ...
- java生成base64编码的png
java代码: 引用包: import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java. ...
- Python使用中文注释和输出中文(原创)
刚开始学习python,需要在Python中注释中文和输出中文,现在开始尝试: 仅为初步学习参考,高手请绕行. -------------------------------------------- ...