本文主要是介绍arrayfun, cellfun, bsxfun函数与Faster R-CNN代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在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就将少的这个虚拟的复制一些来使与多的维数一样,完成两个数组间元素不对等时候的逐个元素的计算。
这篇关于arrayfun, cellfun, bsxfun函数与Faster R-CNN代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!