4. 資料序列之相似度計算程式

List<int> upper = [], center = [], lower = [];

double[] sim = new double[upper.Count];

while (true)
{
    Console.Write(@"請選擇操作項目:
        (1) 輸入模型資料:
        (2) 計算平均相似度:
        (3) 顯示各資料相似度:
請選擇:");
    switch (Console.ReadLine())
    {
        case "1":
            Console.Write("輸入模型資料,總筆數為:");
            int n = int.Parse(Console.ReadLine());
            Console.Write("    序列(x軸):  ");
            for (int i = 0; i < n; i++)
            {
                Console.Write(i.ToString().PadLeft(2) + " ");
            }
            Console.Write("\n數值串列(上限): ");
            upper = Console.ReadLine().Split(" ").Select(int.Parse).ToList();
            Console.Write("數值串列(中心): ");
            center = Console.ReadLine().Split(" ").Select(int.Parse).ToList();
            Console.Write("數值串列(下限): ");
            lower = Console.ReadLine().Split(" ").Select(int.Parse).ToList();

            break;
        case "2":
            Console.Write("請輸入 資料串列 檔名:");
            var f = Console.ReadLine();
            Console.WriteLine("已開放 資料串列 檔名:" + f + "\n");

            var data = File.ReadAllText(f).Split(" ").Select(int.Parse).ToList();
            sim = new double[data.Count];
   for (global::System.Int32 i = 0; i < data.Count; i++)
            {
                double d = data[i];
                if (d >= upper[i] || d <= lower[i])
                {
                    sim[i] = 0;
                    continue;
                }

                if (d == center[i])
                {
                    sim[i] = 1;
                    continue;
                }

                if (d > center[i])
                {
                    sim[i] = 1 - (d - center[i]) / (upper[i] - center[i]);
                }
                else
                {
                    sim[i] = 1 - (center[i] - d) / (center[i] - lower[i]);
                }
            }

            Console.WriteLine($"平均相似度為 {sim.Average():f6}");
            break;
        case "3":
            Console.Write("各資料相似度: ");
            foreach (var item in sim)
            {
                Console.Write($"{item:f6} ");                
            }
            break;
    }

    Console.Write("\n繼續:請按1,結束:請按0:");
    if (Console.ReadLine() == "0") break;
}

Last updated