wavework.m

%wavework源函数

function [varargout]=wavework(opcode,type,c,s,n,x)
%wavework用来编辑小波重构结构的。
%建立在opcode的type和n去获取或修改得到一个指定的系数

%输入:
%opcode          执行程序
%'copy'             [varargout]=y=requested(通过type和n)系数矩阵
%'cut'                [varargout]=[nc,y]得到新的重构向量(零系数矩阵)和系数矩阵
%'paste'            [varargout]=[nc]通过替换x得到新的带有系数矩阵的新重构向量

%type                系数类型
%'a'                    近似值系数
%'h'                    水平细节
%'v'                    垂直细节
%'d'                    对角线细节

%[c,s]是一个小波工具重构结构。n是重构水平(type='a'则忽略)。x是为粘贴用的二维系数矩阵

error(nargchk(4,6,nargin));

if (ndims(c)~=2) | (size(c,1)~=1)
    error('C must be a row vector.')
end

if (ndims(s)~=2 | ~isreal(s) | isnumeric(s) | (size(s,2)) ~=2
    error('S must be a real,numeric two-column array.');
end

elements=prod(s,2);%系数矩阵元素
if (length(c)<elements(end)) | ...
        ~(elements(1)+3*sum(elements(2:end-1))>=elements(end))
    error(['[c,s] must be a standard wavelet decomsition' 'structure.']);
end

if nargin<5,
    n=1;%默认水平为1
end
nmax=size(s,1)-2;%最大水平为[c,s]
aflag=(lower(type(1))=='a');
if ~aflag & (n>nmax)
    error('N exceeds the decomposition in [c,s].');
end

switch lower(type(1))%将指针转为1
    case 'a' 
        nindex=1;
        start=1;stop=elements(1);ntst(1);ntst=nmax;
    case{'h','v','d'}
        switch type
            case 'h',offset=0;%细节的补偿值
            case 'v',offset=1;
            case 'd',offset=2;
        end
        nindex=size(s,1)-n;%索引到详细信息
        start=elements(1)+3*sum(elements(2:nmax-n+1))+offset*elements(nindex)-1;
        stop=start+elements(nindex)-1;
        ntst=n;
    otherwise
        error('TYPE must begin with ''a'',''h'',''v'',or''d''.');
end

switch lower(opcode)%需求反应
    case{'copy','cut'}
        y=repmat(0,s(nindex,:));
        y(:)=c(start:stop);nc=c;
        if strcmp(lower(opcode(1:3)),'cut')
            nc(start:stop)=0;varargout={nc,y};
        else
            varargout={y};
        end
    case'paste'
        if prod(size(x)) ~=elements(end-ntst)
            error('X is not sized for the requested paste.');
        else
            nc=c;nc(start:stop)=x(:);varargout={nc};
        end
    otherwise
        error('Unrecognized OPCODE.')
end
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值