lilongduzhi 发表于 2008-5-8 08:32

如何将下述过程矢量化?

我在编程时,遇到以下问题,
比如 矩阵A为一大型矩阵,B为与A相同行数的列向量;我想用A中的各列减去B向量:
即:
a =
   1   2   3
   4   5   6
   7   8   9
b =
   1
   1
   1
得出:
c=0   1   2
   3   4   5
   6   7   8

谢谢大家!

ch_j1985 发表于 2008-5-8 08:39

原帖由 lilongduzhi 于 2008-5-8 08:32 发表 http://www.chinavib.com/forum/images/common/back.gif
我在编程时,遇到以下问题,
比如 矩阵A为一大型矩阵,B为与A相同行数的列向量;我想用A中的各列减去B向量:
即:
a =
   1   2   3
   4   5   6
   7   8   9
b =
   1
   1
   ...

这样理解不知道对不对?
c=a-

lilongduzhi 发表于 2008-5-8 08:53

主要是考虑a的列数比较大,在复制b矩阵就要消耗很大内存?是么?

ch_j1985 发表于 2008-5-8 09:10

原帖由 lilongduzhi 于 2008-5-8 08:53 发表 http://www.chinavib.com/forum/images/common/back.gif
主要是考虑a的列数比较大,在复制b矩阵就要消耗很大内存?是么?

那用循环呢?

for i=1:length(a)
c(:,i)=a(:,i)-b;
end
c

lilongduzhi 发表于 2008-5-8 09:24

用哪个方案执行效率比较高,谢谢ch_j1985

[ 本帖最后由 eight 于 2008-5-8 11:17 编辑 ]

sogooda 发表于 2008-5-8 09:29

原帖由 lilongduzhi 于 2008-5-8 09:24 发表 http://www.chinavib.com/forum/images/common/back.gif
那那个方案执行效率比较高,谢谢ch_j1985
自己试试。

ch_j1985 发表于 2008-5-8 09:29

原帖由 lilongduzhi 于 2008-5-8 09:24 发表 http://www.chinavib.com/forum/images/common/back.gif
那那个方案执行效率比较高,谢谢ch_j1985

关于这个问题你可以看看这个帖子:
http://www.chinavib.com/forum/thread-44968-1-1.html
如果权限不够,请移步新手上路

wwbeyondww 发表于 2008-5-8 09:59

回复 3楼 的帖子

c=a-repmat(b,1,length(a(1,:)));

eight 发表于 2008-5-8 11:41

原帖由 wwbeyondww 于 2008-5-8 09:59 发表 http://www.chinavib.com/forum/images/common/back.gif
c=a-repmat(b,1,length(a(1,:))); 估计这是最简便的方法,当然,如果b的各行值都相同,直接a-b(1)就可以了

lilongduzhi 发表于 2008-5-8 17:30

profile 的效率分析结果

我尝试使用profile进行代码效率分析:结果显示数据量大时,使用c=a-repmat(b,1,length(a(1,:))); 方法效率要高的
profile on
a = ones(100,10000);
b= ones(100,1);
for ii =1:100
c=a-repmat(b,1,length(a(1,:)));
d=op(a,b);
end
profile report

%%%%%%%%%
function d= op(a,b)
for i = 1:length(a(1,:))
d = a(:,i)-b;
end;
%%%%%%%%

同时我还测试一些函数的性能,比如我想把二进制数转为十进制(遗传算法中的解码函数),
考虑到matlab的自有函数的效率高因此,使用:
bin2dec( num2str(bin))
但效率其实极度的低,还不如自定义函数完成。
同时 采用动态矩阵的效率也非常低,应才开始预先声明矩阵的维数;
谢谢大家的帮助!
页: [1]
查看完整版本: 如何将下述过程矢量化?