声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1982|回复: 16

[编程技巧] 求助程序优化

[复制链接]
发表于 2007-4-27 10:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
[m,n]=size(a);
T=m*n;
a1=0
for ii=1:256
    for jj=1:256
        I0(ii,jj)=0;
        for i=1:m
            for j=1:n
                for k=1:m
                    for l=1:n
                        if (a(i,j)==(ii-1))&(a(k,l)==(jj-1))
                            I0(ii,jj)=I0(ii,jj)+1;
                            a1=a1+1;
                        end
                    end
                end
            end
        end
    end
end;
其中M=150,N=131;
这个对一幅灰度图像求它的二维联合分布密度的程序,但是运行速度十分慢.
请教各位高手有什么优化的办法吗?
再次谢谢大家了
回复
分享到:

使用道具 举报

发表于 2007-4-27 10:56 | 显示全部楼层
原帖由 purplesapple 于 2007-4-27 10:50 发表
[m,n]=size(a);
T=m*n;
a1=0
for ii=1:256
    for jj=1:256
        I0(ii,jj)=0;
        for i=1:m
            for j=1:n
                for k=1:m
                    for l=1:n
            ...



建议先阅读关于矢量化技巧的置顶贴,看有否收获
 楼主| 发表于 2007-4-27 11:06 | 显示全部楼层
谢谢你的建议!现在正在学习中!
 楼主| 发表于 2007-4-28 22:54 | 显示全部楼层
高手能把矢量化具体点吗?看了那个帖子,但是还是不太明白

谢谢指点!
 楼主| 发表于 2007-4-29 13:46 | 显示全部楼层
请高手们帮帮忙
发表于 2007-4-29 13:52 | 显示全部楼层
原帖由 purplesapple 于 2007-4-29 13:46 发表
请高手们帮帮忙


把原始算法的思想整理一下贴上来吧,不然谁能看懂你的程序?
 楼主| 发表于 2007-4-29 18:04 | 显示全部楼层
二维直方图是基于象素之二维联合分布密度定义得到的.设(i,j),(k,l)两个任意象素点上的灰度值分别为g(i,j)和g(k,l),其值分别假设为a,b,则图像灰度值的联合分布密度表示为
P(a,b)=Pk{g(i,j)=a,g(k,l)=b}.其中a,b均为0到L-1之间的灰度整量电平.
我想求一幅灰度图象的二维联合密度。
我首先求出这幅图象的大小,也就是m,n。此外,这幅灰度图象是unint8型,那它的灰度级就是256个灰度级。根据上面关于二维联合分布密度的定义。即是要求得到这幅图中同时满足像素值为a和像素值为b的点的数量。程序中的ii,jj即是相关的a,b值,它可以为0到255之间的任意数(也可以理解为我用ii作为横坐标,jj作为纵坐标)。设置了a,b的值后,我就用个FOR循环来寻找图象中能够同时满足像素值为a和像素值为b的点(即为IF语句后的条件),当满足条件时,那么在该点上加一,就能统计出同时满足a,b的点的数量。因为a,b可以取不同的值,那么就能得出一个256*256大小的矩阵,也就是我想要的二维联合分布密度。
但是用FOR循环实现这个运行速度十分慢。
请教一下有没有什么优化的方法!

谢谢楼上的!
 楼主| 发表于 2007-4-30 16:44 | 显示全部楼层
谢谢大家帮忙!
发表于 2007-4-30 16:59 | 显示全部楼层
要求得到这幅图中同时满足像素值为a和像素值为b的点的数量


这个是什么意思?一个点的像素值不是固定的吗?任意两点的像素值分别为a、b吧?

[ 本帖最后由 eight 于 2007-4-30 17:06 编辑 ]
发表于 2007-4-30 17:50 | 显示全部楼层
看得不是很懂,其实你外加一个简单例子来说明就可以了。如果

  1. A =
  2.      1     2     3
  3.      2     3     6
  4.      6     4     5
  5.      1     1     3
复制代码
则:

  1. B =
  2.      3     6     9     3     3     6
  3.      6     2     6     2     2     4
  4.      9     6     3     3     3     6
  5.      3     2     3     1     1     2
  6.      3     2     3     1     1     2
  7.      6     4     6     2     2     2
复制代码
是吗?

[ 本帖最后由 eight 于 2007-4-30 17:52 编辑 ]
 楼主| 发表于 2007-4-30 23:19 | 显示全部楼层
对呀!就是这个意思~
你这样就清楚明白多了。学习到以后怎么样把问题说清楚了!谢谢你!

就是这个意思,如果象你举的例子一样,矩阵小的话我那样的实现方法运行起来就没有什么问题,但是针对一幅图象而言,那样的循环方式就会让程序的运行速度大大降低!
 
所以请您指点一下,有没有什么优化的方法!

十分感谢!
发表于 2007-4-30 23:21 | 显示全部楼层
原帖由 purplesapple 于 2007-4-30 23:19 发表
对呀!就是这个意思~
你这样就清楚明白多了。学习到以后怎么样把问题说清楚了!谢谢你!

就是这个意思,如果象你举的例子一样,矩阵小的话我那样的实现方法运行起来就没有什么问题,但是针对一幅图象而言, ...


你终于上来回复了,呵呵。我等了一个晚上了,之前在实验室写好了程序,不过走的时候忘记带回来了。我现在看能否重复一下,不行的话可能要等明天或者后天了
发表于 2007-4-30 23:55 | 显示全部楼层
程序:
  1. A = [1,2,3;2,3,6;6,4,5;1,1,3];
  2. B = unique(A);
  3. C = hist(double(A(:)), double(length(B)));
  4. D = C'*C;
  5. E = -diag(diag(D))+D;
  6. E = diag(C) + E;
  7. A
  8. E
复制代码
结果:

  1. A =
  2.      1     2     3
  3.      2     3     6
  4.      6     4     5
  5.      1     1     3

  6. E =
  7.      3     6     9     3     3     6
  8.      6     2     6     2     2     4
  9.      9     6     3     3     3     6
  10.      3     2     3     1     1     2
  11.      3     2     3     1     1     2
  12.      6     4     6     2     2     2
复制代码

[ 本帖最后由 eight 于 2007-5-1 00:18 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 2007-5-1 09:42 | 显示全部楼层
谢谢~~~
我照你的方法改下我的程序!要是有问题再请教你哈!

十分感谢!
 楼主| 发表于 2007-5-1 23:32 | 显示全部楼层
为什么通过最后的取对角元以及通过一维数组的扩展就能得到要求得的统计数值呢

最后两句的具体思想是什么啊?

谢谢!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-12 19:40 , Processed in 0.061635 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表