24小时热门版块排行榜    

Znn3bq.jpeg
查看: 1145  |  回复: 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的回帖

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的回帖
查看全部 6 个回答

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的回帖

爱红茶的猫

木虫 (小有名气)

引用回帖:
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的回帖
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 电子信息270求调剂 +16 terminal469 2026-04-07 16/800 2026-04-12 15:43 by 学zh
[考研] 一志愿哈工大 085600 277 12材科基求调剂 5+5 chenny174 2026-04-10 28/1400 2026-04-12 15:33 by laoshidan
[考研] 290调剂生物0860 +24 哇哈哈,。 2026-04-11 26/1300 2026-04-12 15:21 by 1005715100
[考研] 271求调剂 +20 2261744733 2026-04-11 22/1100 2026-04-11 23:14 by labixiaoqiao
[考研] 085600材料与化工329分求调剂 +16 叶zilin 2026-04-10 16/800 2026-04-11 11:04 by may_新宇
[考研] 一志愿211,化学学硕,310分,本科重点双非,求调剂 +17 努力奋斗112 2026-04-06 20/1000 2026-04-11 00:31 by wangjihu
[考研] 083200 305分 求二轮调剂 不接受跨专业 +9 Claireyyyy 2026-04-09 10/500 2026-04-10 21:21 by Claireyyyy
[考研] 一志愿京区985,085401电子信息,本科电子信息 +3 阳光开朗的男孩 2026-04-10 3/150 2026-04-10 16:29 by sophia_93
[考研] 298求调剂 +13 钉叮咚冬瓜 2026-04-09 13/650 2026-04-10 15:49 by jiajinhpu
[考研] 一志愿沪9,326生物学求相关专业调剂 +4 刘墨墨 2026-04-09 4/200 2026-04-10 12:07 by pengliang8036
[考研] 已调剂 +18 柴郡猫_ 2026-04-09 19/950 2026-04-09 22:10 by 柴郡猫_
[考研] 材料299专硕求调剂 +10 +21 2026-04-09 10/500 2026-04-09 17:34 by 1753564080
[考研] 材料工程调剂 +12 小刘同学吖吖 2026-04-06 13/650 2026-04-09 17:07 by luoyongfeng
[考研] 085600材料与化工,求调剂 +11 won_qii 2026-04-07 11/550 2026-04-09 17:03 by luoyongfeng
[论文投稿] 求助文献原文 10+3 18500821399 2026-04-08 3/150 2026-04-09 16:56 by 北京莱茵润色
[考研] 复试调剂,一志愿郑州大学材料与化工289分 +31 硕星赴 2026-04-08 31/1550 2026-04-09 16:54 by Delta2012
[考研] 求调剂 +8 吃口冰激凌 2026-04-07 8/400 2026-04-09 08:03 by 5268321
[考研] 调剂求助(生物与医药) +6 @6952 2026-04-06 6/300 2026-04-07 23:52 by lys0704
[考研] 285求调剂 +5 mapmath 2026-04-06 6/300 2026-04-06 17:18 by 蓝云思雨
[考研] (调剂)一志愿报考哈尔滨工业大学0857资源与环境专业378分考生 +7 狠狠加油 2026-04-05 8/400 2026-04-06 16:52 by momo皓
信息提示
请填处理意见