一维向量和二维矩阵卷积的等价矩阵乘法实现

经过学习和探索,掌握了一维卷积和二维卷积的矩阵乘法实现。

对于一维向量的卷积,Matlab提供了convmtx计算向量对应的乘法矩阵。它是一个Toeplitz矩阵。

% By TomHeaven, hanlin_tan@nudt.edu.cn @ 2016.09.28
x = [1 2 3]';
y = [4 5 6]';
 
n = length(y);
H = convmtx(x,n);
z = H*y;
 
z_c = conv(x, y);
 
diff = norm(z - z_c)

二维卷积(图像与核卷积)的矩阵乘法形式,矩阵的构造方法可以通过简单的算理推演得到。它是一个Band(带宽)矩阵。

设二维图像矩阵为$X \in R^{m \times n}$,卷积核矩阵为$Y \in R^{p \times p}$。它们按行优先展开得到的向量分别为$x,y$。
继续阅读

Mac10.11安装Python2.7+Theano0.8+CUDA7.5

前面已经介绍过Win10Ubuntu14.04安装Python2.7+Theano0.7+Cuda7.5的方法。本文把最后的Mac系统也搞定了。总体过程比较顺利,中间有些小Trick,都一一解决了。

本文假设你已经安装好了xcode和cuda7.5 sdk(一个从应用商店装,一个从Nvidia官网下dmg装)。

1. 下载安装pip

下载pip-8.1.2.tar.gz,解压后运行

sudo chmod a+x setup.py
sudo ./setup.py install

继续阅读

浅谈图象的全变分和去噪

全变分(Total variation),也称为全变差,是图象复原中常用的一个名词。本文简要介绍全变分的概念以及在图象去噪中的应用。

一维信号的全变分和去噪

一维连续函数的全变分

一维连续实函数f(x)在区间[a, b] \subset R上的全变分定义为参数曲线x \rightarrow f(x), x \in [a,b]的弧长。其表达式为

V_a^b(f) = \int_a^b |f'(x)|dx

说白了,所谓的“变分”就是|f(x+\Delta x) - f(x)|,对于连续函数\Delta x \rightarrow 0。而全变分是对函数定义的区间而言的,就是将“变分”在区间上累加起来。

继续阅读

入门级CUDA程序调试的通用方法——可用于Matlab的MexCuda

Matlab是学术界和业界公认的高级编程语言,其优点在于编程复杂度低,缺点在于for循环的效率极低。为了利用Matlab已有的算法,降低编程复杂度,同时解决for循环效率低的问题,Matlab引入了Mex机制,使得Matlab可以调用C++编写的函数。CUDA是Nvidia推出的并行计算框架,基本遵循了C++语法规则。于是乎出现了Matlab调用CUDA的方法,称之为“MexCuda”。本文就Mex CUDA程序的调试方法简单介绍下经验。

1. CUDA入门——vectorAdd

最简单的CUDA程序莫过于“vectorAdd.cu",即向量的加法。下面给出了一个向量加法的简单例子:
继续阅读

计算机视觉、计算机图形学、图像处理的区别和联系

搞了CV一段时间,仍时不时因为概念问题而困惑,搞不清楚计算机视觉(Computer Vision),计算机图形学(Computer Graphics)和图像处理(Image Processing)的区别和联系。在知乎上看到了一个帖子,觉得解释的很好,结合自己的理解,形成此文存档。

1.基本概念

从定义理解概念是最严谨的。所以首先搞清楚维基百科中这些概念的定义。

计算机视觉(CV):

Computer vision is a field that includes methods for acquiring, processing, analyzing, and understanding images and, in general, high-dimensional data from the real world in order to produce numerical or symbolic information, e.g., in the forms of decisions.[1]

直译过来就是

计算机视觉是一个学科/领域,它包括获取、处理、分析和理解图像或者更一般意义的真实世界的高维数据的方法;它的目的是产生决策形式的数字或者符号信息。

继续阅读