吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 657|回复: 4
收起左侧

[求助] 各位老师,C++出现如下情况该如何改呢?

[复制链接]
jtwc 发表于 2022-5-20 16:51
本帖最后由 jtwc 于 2022-5-20 17:31 编辑

各位老师,C++源码依次输入能正常显示,把所有的手动输入改为数组咋运行出错呢?
[C++] 纯文本查看 复制代码
#include<iostream>
using namespace std;
#define T 5       
#define M 3       
#define N 2        
float mp[M][M];    
float w2a[M][N];   
int O[T];          
int bestPath[T][M];
float pi[M];    

void initHMM()
{
        int i, j, k;
                
//        float mp[3][3] = { { 0.33333, 0.33333, 0.33333 }, { 0.33333, 0.33333, 0.33333 }, { 0.33333, 0.33333, 0.33333 } };
         
//        float w2a[3][2] = { { 0.75, 0.25 }, { 0.4, 0.6 }, { 0.25, 0.75 } };
        
//        float pi[3] = { 0.5, 0.3, 0.2 };
        
//        int O[5] = { 0, 0, 1, 0, 1 };
        
        
        for (i = 0; i<M; i++)
        {
                for (j = 0; j<M; j++)
                {
                        cin >> mp[i][j];
                }
        }
        
        for (i = 0; i<M; i++)
        {
                for (j = 0; j<N; j++)
                {
                        cin >> w2a[i][j];
                }
        }
        
        for (i = 0; i<M; i++)
        {
                cin >> pi[i];
        }
        
        for (i = 0; i<T; i++)
        {
                cin >> O[i];
        }
}

float viterbi()
{
        float maxP[T][M];
        int i, j, t;
        
        float maxpp = 0;
        int   maxPre = 0;
        for (i = 0; i<M; i++)
        {
                maxP[0][i] = pi[i] * w2a[i][O[0]];
                if (maxP[0][i]>maxpp)
                {
                        bestPath[0][i] = -1;
                        maxpp = maxP[0][i];
                }
        }
        
        for (t = 1; t<T; t++)    
        {
                for (i = 0; i<M; i++)
                {
                        maxpp = 0;
                        maxPre = 0;
                        for (j = 0; j<M; j++)
                        {
                                float temp = maxP[t - 1][j] * mp[j][i] * w2a[i][O[t]];
                                if (temp > maxpp)
                                {
                                        maxpp = temp;
                                        maxPre = j;
                                }
                        }
                        maxP[t][i] = maxpp;
                        bestPath[t][i] = maxPre;
                }
        }

        float maxEndP = 0;
        int lastChoice;
        for (i = 0; i<M; i++)
        {
                if (maxP[T - 1][i] > maxEndP)
                {
                        maxEndP = maxP[T - 1][i];
                        lastChoice = i;
                }
        }
        cout << "最大:" << maxEndP << endl;
        cout << "路径(逆序)为:" << endl;
        cout << lastChoice << " ";
        for (t = T - 1; t>0; t--)
        {
                cout << bestPath[t][lastChoice] << " ";
                lastChoice = bestPath[t][lastChoice];
        }
        cout << endl;
        return maxEndP;
}

void forward()
{
        float sumP[T][M];
        
        int t, i, j, k;
        for (i = 0; i<M; i++)
        {
                sumP[0][i] = pi[i] * w2a[i][O[0]];
        }
        
        for (t = 1; t<T; t++)
        {
                for (i = 0; i<M; i++)
                {
                        sumP[t][i] = 0;
                        for (j = 0; j<M; j++)
                        {
                                sumP[t][i] += sumP[t - 1][j] * mp[j][i] * w2a[i][O[t]];
                        }
                }
        }
        float sumPP = 0;
        for (i = 1; i<M; i++)
        {
                sumPP += sumP[T - 1][i];
        }
        cout << "序列为" << sumPP << endl;
}
int main()
{
        initHMM();
        viterbi();
        forward();
        system("pause");
}

for (i = 0; i<M; i++)
        {
                for (j = 0; j<M; j++)
                {
                        cin >> mp[j];
                }
        }
        
        for (i = 0; i<M; i++)
        {
                for (j = 0; j<N; j++)
                {
                        cin >> w2a[j];
                }
        }
        
        for (i = 0; i<M; i++)
        {
                cin >> pi;
        }
        
        for (i = 0; i<T; i++)
        {
                cin >> O;
        }
以上源码改为如下:
float mp[3][3] = { { 0.33333, 0.33333, 0.33333 }, { 0.33333, 0.33333, 0.33333 }, { 0.33333, 0.33333, 0.33333 } };
         
float w2a[3][2] = { { 0.75, 0.25 }, { 0.4, 0.6 }, { 0.25, 0.75 } };
        
float pi[3] = { 0.5, 0.3, 0.2 };
        
int O[5] = { 0, 0, 1, 0, 1 };
        

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

vtor 发表于 2022-5-20 17:29
懒得看,连注释都没有,
ymdwsq 发表于 2022-5-20 17:59
unmask 发表于 2022-5-20 20:19
改为数组只是给局部变量赋值了,没有给全局变量赋值。但是你后面的运算全部用的全局变量.
手动输入,你是给全局变量赋值的。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
jtwc + 1 + 1 我很赞同!

查看全部评分

 楼主| jtwc 发表于 2022-5-20 20:42
unmask 发表于 2022-5-20 20:19
改为数组只是给局部变量赋值了,没有给全局变量赋值。但是你后面的运算全部用的全局变量.
手动输入,你是 ...

谢谢老师,已解决
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 11:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表