matconvnet学习三:matlab中的类定义

matconvnet的Dagnn文件夹中定义了一系列的类如Layers,conv等等,类的构成一般为:

classdef classname

       properties

       end

       methods

       end

end

详细了解的话,可以使用doc classdef命令,去读一下matlab的帮助文档

code1:这个就是matconvnet下卷积层类的定义方法

classdef Conv < dagnn.Filter  %(<代表继承)
  properties
    size = [0 0 0 0]
    hasBias = true
    opts = {'cuDNN'}
  end

  methods
    function outputs = forward(obj, inputs, params)
      if ~obj.hasBias, params{2} = [] ; end
      outputs{1} = vl_nnconv(...
        inputs{1}, params{1}, params{2}, ...
        'pad', obj.pad, ...
        'stride', obj.stride, ...
        'dilate', obj.dilate, ...
        obj.opts{:}) ;
    end

    function [derInputs, derParams] = backward(obj, inputs, params, derOutputs)
      if ~obj.hasBias, params{2} = [] ; end
      [derInputs{1}, derParams{1}, derParams{2}] = vl_nnconv(...
        inputs{1}, params{1}, params{2}, derOutputs{1}, ...
        'pad', obj.pad, ...
        'stride', obj.stride, ...
        'dilate', obj.dilate, ...
        obj.opts{:}) ;
    end

    function kernelSize = getKernelSize(obj)
      kernelSize = obj.size(1:2) ;
    end

    function outputSizes = getOutputSizes(obj, inputSizes)
      outputSizes = getOutputSizes@dagnn.Filter(obj, inputSizes) ;
      outputSizes{1}(3) = obj.size(4) ;
    end

    function params = initParams(obj)
      % Xavier improved
      sc = sqrt(2 / prod(obj.size(1:3))) ;
      %sc = sqrt(2 / prod(obj.size([1 2 4]))) ;
      params{1} = randn(obj.size,'single') * sc ;
      if obj.hasBias
        params{2} = zeros(obj.size(4),1,'single') ;
      end
    end

    function set.size(obj, ksize)
      % make sure that ksize has 4 dimensions
      ksize = [ksize(:)' 1 1 1 1] ;
      obj.size = ksize(1:4) ;
    end

    function obj = Conv(varargin)
      obj.load(varargin) ;
      % normalize field by implicitly calling setters defined in
      % dagnn.Filter and here
      obj.size = obj.size ;
      obj.stride = obj.stride ;
      obj.pad = obj.pad ;
    end
  end
end

code:2我自己的一个小demo

classdef classdemo<handle
   %2018.12.12 
   %实例化: l=classdemo
   %存放类的文件夹一般以@开头+类的名字
   properties (Access=public)
       %properties的有一个属性Access
       %Access=public是公有
       %protected保护成员,只有类或者子类能调用
       %private只能通过本类对象访问
       name='sunyi';
       sex='man';
   end
   
   methods (Static)%如果使用Static属性可以直接调用,不需要实例化
       function print(obj,choice)
          if(strcmp(choice,'name'))
              fprintf('name:%s\n',obj.name);
              
          elseif(strcmp(choice,'sex'))
              fprintf('name:%s\n',obj.sex);
          end
       end
   end
   events
       
   end
   
   enumeration
   end
end

 

@命令

@命令用于获取函数句柄的操作符,可以部分改变函数的入口参数数目:

F=@sin

则F(90)=0

函数名=@(参数列表) 运算表达式(或者函数),由此可以定义一个新的 函数

Y=@(x) x^2

Y(4)=16

Y=@(x)  Calculating(x,y) %Calculating(x,y)为一个函数,Y则是基于Calculating只需要一个入口参数的新的函数

 

 

------------------------------------------------------------------2020.06.22----------------------------------------------------------------------

@文件夹里面存储的是类的.m文件,也可以将类的methods函数放进去(比如methods太大,需要单独放在一个.m文件里面)

+开头的文件夹存储的则是代表的是一个package,里面可以包含@文件夹和功能函数,也可以包含类文件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

syvge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值