matlab+代码前+有加号,文件夹名前面有个加号例如 '+filename',还有关于类

classdef states < handle %定义类states

properties

T %序列长度

state_dim %状态数

obs_distns %观察值概率分布

dur_distns %持续时间分布

transition_distn %状态转移概率分布

initial_distn %初始概率分布

trunc % ?

stateseq %状态序列

durations %持续时间

stateseq_norep %状态序列 ?

end

methods

function self = states(T,state_dim,obs_distns,dur_distns,transition_distn,initial_distn,trunc)

if ~exist('trunc','var'), self.trunc = T+1; else self.trunc = trunc; end

% 如果tranc是变量,则 self.trunc = T+1,否则为trunc ?

self.T = T;

self.state_dim = state_dim;

self.obs_distns = obs_distns;

self.dur_distns = dur_distns;

self.transition_distn = transition_distn;

self.initial_distn = initial_distn;

self.generate();

end

%self结构还是类啊? 应该是结构struct

function resample(self,data)

% generate duration pmf, sf, and likelihood values

possible_durations = 1:self.T;

aDl = zeros(self.T, self.state_dim);

aDsl = zeros(self.T,self.state_dim);

aBl = zeros(self.T,self.state_dim);

for idx=1:self.state_dim %对每个状态循环

aDl(:,idx) = self.dur_distns{idx}.log_pmf(possible_durations)';

aDsl(:,idx) = self.dur_distns{idx}.log_sf(possible_durations)';

aBl(:,idx) = self.obs_distns{idx}.log_likelihood(data)';

end

% run backwards message passing

[betal, betastarl] = self.messages_backwards(log(self.transition_distn.A),aBl',aDl',aDsl',self.trunc);

% sample forwards

self.sample_forwards(aBl',betal,betastarl);

end

function sample_forwards(self,aBl,betal,betastarl)

T = size(aBl,2);

stateseq = zeros(1,T);

durations = [];

stateseq_norep = [];

idx = 1;

A = self.transition_distn.A;

nextstate_unsmoothed = self.initial_distn.pi_0;

while idx <= self.T

logdomain = betastarl(:,idx) - max(betastarl(:,idx));

nextstate_distr = exp(logdomain) .* nextstate_unsmoothed;

% due to numerical issues, might be all zero.

% if that's the case, there's no easy fix, so we'll just

% follow the messages.

if all(nextstate_distr == 0)

nextstate_distr = exp(logdomain);

end

state = util.sample_discrete(nextstate_distr);

durprob = rand();

dur = 0; % always incremented at least once

breaking = 0; % see section at line 88

while durprob > 0 && ~breaking

% in the body of this loop, we're really considering

% dur+1 being the duration for this state.

p_d_marg = self.dur_distns{state}.pmf(dur+1);

if p_d_marg == 0

dur = dur + 1;

continue;

end

if idx+dur <= self.T

p_d = exp(sum(aBl(state,idx:idx+dur),2) + betal(state,idx+dur) - betastarl(state,idx)) * p_d_marg;

durprob = durprob - p_d;

dur = dur + 1;

else

% we're out of data, so we need to sample a

% duration conditioned on us having lasted at least

% this long. the likelihood contributes the same to

% all possibilities, so we can just sample from the

% prior (conditioned on it being at least this

% long). rejection sampling is easiest!

while 1

lastdur = self.dur_distns{state}.rvs();

if lastdur > dur

dur = lastdur;

breaking = 1;

break;

end

end

end

end

stateseq(idx:min(idx+dur-1,T)) = state;

stateseq_norep = [stateseq_norep, state];

durations = [durations, dur];

nextstate_unsmoothed = A(state,:)';

idx = idx + dur;

end

self.stateseq = stateseq;

self.durations = durations;

self.stateseq_norep = stateseq_norep;

end

function obs = generate(self)

% generate states

idx = 1;

nextstate_distr = self.initial_distn.pi_0;

A = self.transition_distn.A;

stateseq = [];

stateseq_norep = [];

durations = [];

while idx <= self.T

% sample a state

state = util.sample_discrete(nextstate_distr);

% sample a druation for that state

duration = self.dur_distns{state}.rvs();

% save everything

stateseq_norep = [stateseq_norep, state];

durations = [durations, duration];

stateseq = [stateseq, state * ones(1,duration)];

% set up next state distribution

nextstate_distr = A(state,:)';

% update index

idx = idx + duration;

end

self.stateseq_norep = stateseq_norep;

self.durations = durations;

self.stateseq = stateseq(1:self.T);

% generate observations

% not pre-allocated just because we don't know the obs dimension here

obs = [];

for t=1:self.T

obs = [obs, self.obs_distns{self.stateseq(t)}.rvs(1)];

end

end

end

methods(Static)

function [betal, betastarl] = messages_backwards(Al,aBl,aDl,aDsl,trunc)

T = size(aBl,2);

state_dim = size(Al,1);

betal = zeros(state_dim,T);

betastarl = zeros(state_dim,T);

for t=T:-1:2

betastarl(:,t) = util.logsumexp(betal(:,t:min(T,t+trunc-1)) + cumsum(aBl(:,t:min(T,t+trunc-1)),2) + aDl(:,1:min(trunc-1,T-t+1)));

if T-t+1 < trunc

betastarl(:,t) = util.logsumexp([betastarl(:,t),sum(aBl(:,t:end),2) + aDsl(:,T-t+1)]); % censoring calc

end

betal(:,t-1) = util.logsumexp(bsxfun(@plus,betastarl(:,t)',Al));

end

t = 1;

betastarl(:,t) = util.logsumexp(betal(:,t:min(T,t+trunc-1)) + cumsum(aBl(:,t:min(T,t+trunc-1)),2) + aDl(:,1:min(trunc-1,T-t+1)));

if T-t+1 < trunc

betastarl(:,t) = util.logsumexp([betastarl(:,t),sum(aBl(:,t:end),2) + aDsl(:,T-t+1)]); % censoring calc

end

end

end

end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于MATLAB代码,可以提取100个不同文件夹中所有带有"data"字符的Excel表格: ```matlab % 设置文件夹路径和文件关键字 folder_path = '/your/folder/path/'; % 替换成实际的文件夹路径 file_keyword = 'data'; % 替换成实际的文件关键字 % 获取文件夹下所有文件夹称 folders = dir(folder_path); folders = folders([folders(:).isdir]); % 仅保留文件夹 folders = folders(~ismember({folders(:).name},{'.','..'})); % 去除.和..文件夹 % 遍历每个文件夹,提取所有带有"data"字符的Excel表格 for i = 1:length(folders) folder_name = folders(i).name; folder_fullpath = fullfile(folder_path, folder_name); % 获取当文件夹下所有Excel表格的文件 files = dir(fullfile(folder_fullpath, '*.xlsx')); % 遍历每个Excel表格,检查文件是否包含指定的关键字 for j = 1:length(files) file_name = files(j).name; if contains(file_name, file_keyword) file_fullpath = fullfile(folder_fullpath, file_name); % 在这里进行对应的操作,例如读取Excel数据 fprintf('Found file: %s\n', file_fullpath); end end end ``` 在上述代码中,需要替换`folder_path`和`file_keyword`变量为实际的文件夹路径和文件关键字。代码使用`dir`函数获取文件夹下所有文件夹称和Excel表格文件,然后使用`contains`函数判断文件是否包含指定的关键字。如果包含,则可以进行对应的操作,例如读取Excel数据。在最后的`fprintf`语句中,输出找到的Excel表格的完整路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值