arrayfun, cellfun, bsxfun函数与Faster R-CNN代码

3 篇文章 0 订阅

在Faster R-CNN的matlab代码里,看到了很多不认识的“fun”系列函数,在此总结一下。
首先,向量化编程:arrayfun及cellfun函数的使用,来实现将任意函数应用到数组内包括结构在内的所有元素。这样很多以前不可避免的循环现在可以向量化了。而向量化正是Matlab不遗余力追求的核心思想之一。同时,在元素个数不匹配的两个量直接计算时,bsxfun函数得以很好解决。

arrayfun

简单例子:

y = arrayfun(@(alpha) f1(x,k,alpha), alpha,'UniformOutput',false);  

其中,x是数据,k是定下来的参数,alpha是待调参数,比如alpha = [1,2,3];

来看一下Faster R-CNN里一个例子:

[anchors, im_scales] = arrayfun(@(x) func(im_size, conf, x, feature_map_size), ...
            conf.scales, 'UniformOutput', false);

func函数的返回值是一个向量,对conf.scales中的每一个元素调用func函数,计算结果放在anchors, im_scales中,生成的anchors, im_scales也都应该是向量。

cellfun

简单例子:

y = cellfun(@(alpha) f1(x,k,alpha), alpha,'UniformOutput',false);  

这里与arrayfun不同的是:待定参数alpha是cell,即alpha = {1,2,3}; 那么该例子即可实现输入x,k,alpha(cell量),进行函数f1操作,得到同是y。

来看一下Faster R-CNN里一个例子:

bbox_targets{i} = cellfun(@(x, y) ...
           compute_targets(conf, scale_rois(gt_rois, im_size, y), gt_labels,  x, image_roidb_cell{i}, y), ...
           anchors, im_scales, 'UniformOutput', false);

查看前后代码:可以找到compute_targets函数定义:

function bbox_targets = compute_targets(conf, gt_rois, gt_labels, ex_rois, image_roidb, im_scale)

同理,cellfun函数即为,将cell里每一个量anchors, im_scales作为输入量替代上式中的x,y位置,进行compute_targets函数操作。

bsxfun

C=bsxfun(fun,A,B)

bsxfun与上述两个函数有一定差异,主要是进行两个数组间元素逐个的计算,如:直接对一个矩阵A的每一列或者每一行与同一个长度相等的 向量 a 进行某些操作。这里的fun主要是函数句柄或者m文件,同时也可以是内置函数:
@plus 加
@minus 减
@times 数组乘
@rdivide 左除,Right array divide
@ldivide 右除,Left array divide

来看一下Faster R-CNN里一个例子:

means = bsxfun(@rdivide, sums, class_counts);
stds = (bsxfun(@minus, bsxfun(@rdivide, squared_sums, class_counts), means.^2)).^0.5;

这里的means得到的结果即为class_counts里每行(列)元素除以sums(A左除B即为 inv(A)*B)。
而这里的stds得到的结果即为class_counts里每行(列)元素除以squared_sums,得到的矩阵的每行(列)数字减去means.^2,得到的矩阵里的一行(列)数再都 .^0.5。
虽然有点绕口,但是很容易理解,就是对于需要操作的A,B矩阵,如果A和B的大小相同,那么直接正常运算。但如果有某维不同,那么bsxfun就将少的这个虚拟的复制一些来使与多的维数一样,完成两个数组间元素不对等时候的逐个元素的计算。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值