[复杂度与熵]KC复杂度算法实现

作者zhonglihao
算法名KC复杂度
分类复杂度与熵
复杂度近O(n3)
形式与数据结构Matlab代码,普通搜索匹配(C语言实现会较复杂)
特性

跑起来很慢,但是还挺准

,对过零分布混乱与规整的信号有较好的区分性

具体参考出处《基于EEG的睡眠分期与睡眠评估方法研究》高群霞,硕士论文

% parameter input
tar_data = 0; %自己输入数据
data_len = length(tar_data);

% 对交流信号进行粗粒化处理(二值化),直流信号不适用
for i = 1:1:data_len
    if(tar_data(i)>=0)
        tar_data_coarse(i) = 1;
    else
        tar_data_coarse(i) = 0;
    end
end

% 标记新的模式,记1
KC_mark     = zeros(data_len,1);
% 第一个元素直接记1
KC_mark(1)  = 1;
% 总模式数量,初始化置1
KC_cn       = 1;

% 已出现信号的长度
S_len       = 1;
% 未被记录的数据段开始位置
Q_start     = 2;
% 未被记录的数据段结束位置
Q_end       = 2;

for i = 2:1:data_len - 1
    S_data = tar_data_coarse(1:S_len);% 获取已记录模式的数据
    Q_data = tar_data_coarse(Q_start:i);% 获取未记录模式的数据
    
	% 如果新数据长度比已经记录的数据还长,则直接认定为新模式
    if(length(Q_data)>length(S_data))
        KC_mark(i)  = 1; 			% 标记新模式点
        S_len       = i; 			% 更新S末端位置
        Q_start     = i + 1; 		% 更新Q初始位置
        KC_cn       = KC_cn + 1; 	% 增加复杂度总量计数
        continue;
    end
    
	% 搜索匹配
    j_max = length(S_data) - length(Q_data) + 1;
    match_len = length(Q_data); % 如果计数匹配为Q_data长度则为已存在此模式
    match_count = 0;
    find_none_flag = 1; % 找不到Q模式
    for j = 1:1:j_max
        S_data_match = S_data(j:j+match_len-1);
        Q_data_match = Q_data;
        match_count = 0;
        for k = 1:1:match_len
            if(S_data_match(k)==Q_data_match(k))
                match_count = match_count + 1;
            end
        end 
        
        %finded
        if(match_count == match_len)
            find_none_flag = 0;
            break;
        end
    end
    
    if(find_none_flag ==1)
        KC_mark(i)  = 1;
        S_len       = i;
        Q_start     = i + 1;
        KC_cn       = KC_cn + 1;
        continue;
    end
end

% 复杂度为KC_cn / (data_len / log2(data_len))
% 一般取KC_cn观察即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值