24小时热门版块排行榜    

Znn3bq.jpeg
汕头大学海洋科学接受调剂
查看: 1148  |  回复: 5

爱红茶的猫

木虫 (小有名气)

[求助] MATLAB编程优化问题 已有2人参与

求助一个matlab编程的优化问题,类似霍夫变换(Hough Transform)的累加问题。
一维向量a里面为矩阵A的行下标信息,一维向量b里面是A的列下标信息。
使用for循环的赋值程序如下:

for i = 1 :m
     for j = 1 : n
          count = A(a(i), b(j)) + 1;
          A(a(i), b(j)) = count;
      end
end

问题是matlab的for循环效率低下,如果m和n的值非常大的话(>10000),计算时间很长。
在此求助matlab高手,能否使用矩阵实现的方法代替for循环来提高编程效率?
期待确实有帮助的应助回帖
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

feixiaolin

荣誉版主 (文坛精英)

优秀版主

【答案】应助回帖


感谢参与,应助指数 +1
爱红茶的猫: 金币+1, 有帮助, 可是这段程序还是基于双重for循环的,实际效率并没有提高多少,不知道哪位可以给出类似于将a, b构造成2维矩阵,然后整体进行运算累加的结果。 2014-11-24 14:59:52
for i = 1 :m
     m1=a(i);   
     for j = 1 : n
          m2= b(j);
          A(m1, m2) += 1;
      end
end
2楼2014-11-24 14:45:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yisc1981

铜虫 (初入文坛)

【答案】应助回帖

★ ★ ★ ★ ★
感谢参与,应助指数 +1
爱红茶的猫: 金币+5, ★★★很有帮助, 经过验证,A矩阵如果为零矩阵的话没有误差,但是方法2中最后5行的意思不太明白,如果能解释一下的话一定采纳为最佳答案。 2014-11-27 11:01:52
clear all
clc

A=rand(10);
B=A; %留着比较
a=[2 2 6 8 5 5 5 5];
m=length(a)
b=[1 1 1 3 3 9 9 9 4 4];
n=length(b);
for i =1:m
     for j = 1 : n
          count = A(a(i), b(j)) + 1;
          A(a(i), b(j)) = count;
      end
end
% 第二种方法
a=sort(a)
b=sort(b)
[a,ida]=unique(a)
[b,idb]=unique(b)
ida=[0,ida]
idb=[0,idb]
counta=diff(ida)
countb=diff(idb)
B(a,b)=B(a,b)+counta'*countb

%检查两端程序是否相等
D=A-B
%经过试验,D的元素有时候有数值误差,但是都在1.0e-14量级,稍微处理就行
3楼2014-11-26 09:50:41
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

爱红茶的猫

木虫 (小有名气)

引用回帖:
3楼: Originally posted by yisc1981 at 2014-11-26 09:50:41
clear all
clc

A=rand(10);
B=A; %留着比较
a=;
m=length(a)
b=;
n=length(b);
for i =1:m
     for j = 1 : n
          count = A(a(i), b(j)) + 1;
          A(a(i), b(j)) = count;
      end
...

十分感谢回复,能不能请您给解释一下方法二里
counta=diff(ida)
countb=diff(idb)
B(a,b)=B(a,b)+counta'*countb
这几行的含义?
我验证了一下,如果A是零矩阵的话2中方法是没有误差的。
谢谢!
4楼2014-11-26 13:57:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yisc1981

铜虫 (初入文坛)

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
爱红茶的猫(nono2009代发): 金币+14 2014-11-28 17:03:05
引用回帖:
4楼: Originally posted by 爱红茶的猫 at 2014-11-26 13:57:16
十分感谢回复,能不能请您给解释一下方法二里
counta=diff(ida)
countb=diff(idb)
B(a,b)=B(a,b)+counta'*countb
这几行的含义?
我验证了一下,如果A是零矩阵的话2中方法是没有误差的。
谢谢!...

理解编程思想就不难理解那几句话了,至于那些函数是什么意思可以查询相关的说明,这里将编程思想说说吧。
      因为a,b中存储的是A矩阵的行标和列标,如果那个下标出现的次数多,则A中对应元素被加的量就大。所以首先是找出a,b中所含不同的下标到底有多少,只对这些不同下标进行一次寻址。找到A中对应的元素后,加上其因该被访问的次数就行了。从而不必要反复用for循环。
     
    下面几行得到a,b中到底还有多少个不同元素,
     a=sort(a)   %为什么要先排序是为了后面通过diff能求出不同元素的计数,也就是a中不同元素应该被访问的次数。
     b=sort(b)
    [a,ida]=unique(a)  %找出不同的元素,经过这一步后a中就只含有不同元素了,不会有重复的。
    [b,idb]=unique(b)   
   
    下面几行是找出a,b不同元素出现的次数,也就是访问的计数
    ida=[0,ida]
    idb=[0,idb]
    counta=diff(ida)
    countb=diff(idb)
    为什么能得到计数,是因为ida记录的是a中不同元素在a中最后一次出现的位置。
   
    B(a,b)得到的是A的一个子矩阵(“上面讲了,B=A),也就是这些元素才能被你给的那些两个for循环访问到。
   
    D=counta'*countb  得到一个与B(a,b)同样大小的矩阵,他们的对应元(行被访问次数乘以列被访问次数,就是其交叉点处总的访问次数)
    D(i,j)就是A(a(i),b(i))应该被最终加上的数字,也就是你那两个for循环中A(a(i),b(i))应该被访问到的次数。
   我也觉得很难用语言表达清楚,如果还是不明白你一步步用纸验算,就看出其中的奥秘了。
5楼2014-11-28 00:13:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

爱红茶的猫

木虫 (小有名气)

引用回帖:
5楼: Originally posted by yisc1981 at 2014-11-28 00:13:53
理解编程思想就不难理解那几句话了,至于那些函数是什么意思可以查询相关的说明,这里将编程思想说说吧。
      因为a,b中存储的是A矩阵的行标和列标,如果那个下标出现的次数多,则A中对应元素被加的量就大。所以 ...

非常感谢您的回复,非常清楚,学习了!
6楼2014-11-28 11:10:08
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 爱红茶的猫 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 药学305求调剂 +9 玛卡巴卡boom 2026-04-10 9/450 2026-04-14 11:20 by 不我拉绿卡
[考研] 22408 312求调剂 +9 门路摸摸 2026-04-14 9/450 2026-04-14 11:12 by zhy10sdust
[考研] 求助调剂,跨调 +16 X十甫寸Y 2026-04-11 17/850 2026-04-14 10:59 by 不我拉绿卡
[考研] 调剂求收留 +32 果然有我 2026-04-10 33/1650 2026-04-14 08:49 by 木木mumu~
[考研] 材料085601调剂 +32 何润采123 2026-04-10 34/1700 2026-04-14 08:47 by 木木mumu~
[考研] 272分材料子求调剂 +41 Loy0361 2026-04-10 53/2650 2026-04-13 14:20 by 张zhihao
[考研] 材料考研调剂 +29 云木达达 2026-04-11 31/1550 2026-04-13 13:32 by lyh鲁老师
[考研] 考研二轮调剂 +10 故人?? 2026-04-09 10/500 2026-04-13 09:55 by szhize
[考研] 296求调剂 +8 汪!?! 2026-04-09 8/400 2026-04-11 21:02 by 逆水乘风
[考研] 化学工程与技术324调剂 +23 孙常华 2026-04-09 25/1250 2026-04-11 00:07 by 骑牛渡寒江
[考研] 吉大计算机技术331分,英语六级,求调剂 +3 峰峰021116 2026-04-09 3/150 2026-04-10 20:01 by chemisry
[论文投稿] mdpi小修rvr时间四五天了 20+3 哈哈high 2026-04-08 5/250 2026-04-10 16:02 by 北京莱茵润色
[考研] 071000生物学调剂求助 +17 zzzzwww 2026-04-09 20/1000 2026-04-10 15:55 by 求调剂zz
[考研] 314求调剂 +14 weltZeng 2026-04-09 14/700 2026-04-09 23:14 by wolf97
[考研] 已调剂 +18 柴郡猫_ 2026-04-09 19/950 2026-04-09 22:10 by 柴郡猫_
[考研] 本科211 工科085400 280分求调剂 可跨专业 +3 LZH(等待调剂中 2026-04-09 3/150 2026-04-09 21:29 by wutongshun
[考研] 一志愿中科院105500专业总分315求调剂 +6 lallalh 2026-04-09 7/350 2026-04-09 17:51 by lallalh
[考研] 332,085601求调剂 +12 ydfyh 2026-04-09 14/700 2026-04-09 17:28 by wp06
[考研] 一志愿西南大学生物学学硕344 求生物学相关调剂/生物与医药 +7 超人不会飞@ 2026-04-08 7/350 2026-04-09 09:35 by gong120082
[考研] 388求调剂 +6 四川王涛 2026-04-07 8/400 2026-04-08 00:17 by JourneyLucky
信息提示
请填处理意见