+ -
当前位置:首页 → 问答吧 → 在Matlab里如何将简单的循环和分支语句变成纯向量运算

在Matlab里如何将简单的循环和分支语句变成纯向量运算

时间:2011-09-10

来源:互联网

原文:http://www.jiang925.com/content/convert-simple-iteration-and-branch-vector-operations-matlab-0 <---帮忙点广告啊,哈哈
此乃原创,转载注明出处。^

前几天帮学精算的朋友改代码。学精算不深究编程,但还离不开Matlab的数学计算。话说我看到向量计算眼前一亮,联想到之前研究的GPU编程,向量运算要是能分发到CUDA进行运算岂不是太高效了。有点儿跑题了。我是想说,向量运算可以充分利用多线程来加速运算。所以能用向量运算的东西一定不要用循环。不排除循环多线程的可能,不过我估计Matlab没有那么高级能自动优化循环。最多我估计也就做到loop unrolling。

简单的向量运算,懂点儿Matlab的应该都会。
比如说要把一个1xN的向量每一项都乘2。循环写成下面的形式:
for j = 1:N
    v(j) = v(j) * 2;
end
而使用向量运算就看起来简洁多了,也肯定更高效:
v(:) = v(:) * 2;
其中的":"代替了下标,代表所有的项都进行这一行操作。

上面是简单的循环。再复杂一点,比如说循环嵌套分支怎么办呢?方法还是有的。主要利用matlab里面将true解释成1,把false解释成0的特性。
比如说下面这段代码:
for j = 1:N
    if A<B
        v(j) = C;
    else
        v(j) = D;
    end
end
单纯地用向量运算修改不好使了。需要绕一点儿弯儿了:
v(:) = (A<B) * C + (1 - (A<B)) * D;
或者
v(:) = (A<B) * C + (A>=B) * D;

肯定还有更复杂的语句可以转换。等碰上了再回来加上。

作者: jiang925   发布时间: 2011-09-10

回复 jiang925

有前提条件的..就是循环里前后要没有联系才行。

作者: zzjzzpgg12   发布时间: 2011-09-18