📄 vitshort.c
字号:
/* =========================================================================== * function out = vitshort(fst_in, snd_in, n_sta, mima) * VITSHORT makes two steps of transfering expense into one step expense. * OUT = VITSHORT(FST_IN SCD_IN, N_STA, MIMA) * FST_IN, step one * SND_IN, step two * N_STA, number of state * MIMA, ==1 to find the minimum, == 0 to find the maximum * OUT, FST_IN, and SND_IN are size 2^n_sta row vectors which recorded the * data of [d00, d10, d20, ..., dn0, d01, d11, d21,..., dn1, ...., d0n, * d1n, d2n, ...., dnn] * where dij means the cost of transfering state i to state j. * dij = NaN means that there is no transfering between the two states. * * Used by viterbi. * =========================================================================== * Jun Wu, Jan 2nd, 1996 * Revised Wes Wang Jan. 9, 1996 * * Copyright (c) 1996 The MathWorks, Inc. * All Rights Reserved * $Revision: 1.1 $ $Date: 1996/04/01 18:15:03 $ * ========================================================================= */#include <math.h>#include "mex.h"void mexFunction(int nlhs, Matrix *plhs[], int nrhs, Matrix *prhs[]){ int i, j, k, nsta, pow_sta, aft_indx, len_indx, len, indx; int *wei_indx, *sub_indx; double max, min; double *wei_mat_fst, *wei_sum; double wei_mat_snd; double *FstIn, *SndIn, *NSta, *MiMa, *Out; double NaN = mexGetNaN(); FstIn = mxGetPr(prhs[0]); SndIn = mxGetPr(prhs[1]); NSta = mxGetPr(prhs[2]); MiMa = mxGetPr(prhs[3]); /*pow_sta = length(fst_in);*/ pow_sta = mxGetM(prhs[0])*mxGetN(prhs[0]); Out = mxGetPr(plhs[0] = mxCreateFull(1,pow_sta,0)); nsta = (int)NSta[0]; wei_mat_fst = (double *)mxCalloc(nsta, sizeof(double)); wei_sum = (double *)mxCalloc(nsta, sizeof(double)); wei_indx = (int *)mxCalloc(nsta, sizeof(int)); sub_indx = (int *)mxCalloc(nsta, sizeof(int)); /*for i = 1 : n_sta * aft_indx = i * n_sta - n_sta; */ for(i=1; i <= nsta; i++){ aft_indx = i * nsta - nsta; /* for j = 1 : n_sta * wei_mat = [fst_in(j : n_sta : pow_sta);... * snd_in(aft_indx+1 : aft_indx + n_sta)]; * wei_sum = sum(wei_mat); * wei_indx = find(~isnan(wei_sum)); */ for(j=1; j <= nsta; j++){ for(k=0; k < nsta; k++) wei_mat_fst[k] =FstIn[k * nsta + j - 1]; len_indx = 0; for(k=0; k < nsta; k++){ wei_mat_snd = SndIn[aft_indx + k]; if (mexIsNaN(wei_mat_fst[k]) || mexIsNaN(wei_mat_snd)) { wei_sum[k] = NaN; } else { wei_sum[k] = wei_mat_fst[k] + wei_mat_snd; wei_indx[len_indx] = k; len_indx++; } } /* if mima * sub_indx = find(wei_sum == max(sum(wei_mat(:, wei_indx)))); * if length(sub_indx) > 1 * sub_indx = find(wei_mat(1,:) == max(wei_mat(1, sub_indx))); * end; * else * sub_indx = find(wei_sum == min(sum(wei_mat(:, wei_indx)))); * if length(sub_indx) > 1 * sub_indx = find(wei_mat(1,:) == min(wei_mat(1, sub_indx))); * end; * end; */ if (len_indx > 0) { len = 0; if(MiMa[0] != 0 ){ max = wei_sum[wei_indx[0]]; sub_indx[0] = wei_indx[0]; k = 1; while (k < len_indx) { if ( max < wei_sum[wei_indx[k]] ) { max = wei_sum[wei_indx[k]]; sub_indx[0] = wei_indx[k]; } k++; } for(k=0; k < len_indx; k++){ if (wei_sum[wei_indx[k]] == max ){ sub_indx[len] = wei_indx[k]; len++; } } indx = sub_indx[0]; if (len > 1){ max = wei_mat_fst[sub_indx[0]]; k = 1; while(k < len){ if( max < wei_mat_fst[sub_indx[k]] ) { max = wei_mat_fst[sub_indx[k]]; indx = sub_indx[k]; } k++; } } } else { min = wei_sum[wei_indx[0]]; sub_indx[0] = wei_indx[0]; k = 1; while (k < len_indx){ if ( min > wei_sum[wei_indx[k]] ) { min = wei_sum[wei_indx[k]]; sub_indx[0] = wei_indx[k]; } k++; } for(k=0; k < len_indx; k++){ if (wei_sum[wei_indx[k]] == min ){ sub_indx[len] = wei_indx[k]; len++; } } indx = sub_indx[0]; if ( len > 1 ){ min = wei_mat_fst[sub_indx[0]]; k = 1; while (k < len){ if( min > wei_mat_fst[sub_indx[k]] ) { min = wei_mat_fst[sub_indx[k]]; indx = sub_indx[k]; } k++; } } else { indx = sub_indx[0]; } } /* if ~isempty(sub_indx) * out(aft_indx + j) = wei_sum(sub_indx(1)); * else * out(aft_indx + j) = NaN; * end; * end; *end; */ Out[aft_indx + j - 1] = wei_sum[indx]; } else { Out[aft_indx + j - 1] = NaN; } } } return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -