24小时热门版块排行榜    

查看: 1122  |  回复: 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

铜虫 (初入文坛)

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
爱红茶的猫(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的回帖
查看全部 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的回帖

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的回帖
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 303求调剂 +5 睿08 2026-03-17 7/350 2026-03-21 03:11 by JourneyLucky
[考研] 278求调剂 +6 烟火先于春 2026-03-17 6/300 2026-03-21 01:57 by JourneyLucky
[考研] 一志愿 西北大学 ,070300化学学硕,总分287,双非一本,求调剂。 +3 晨昏线与星海 2026-03-18 3/150 2026-03-21 00:46 by JourneyLucky
[考研] 一志愿重庆大学085700资源与环境专硕,总分308求调剂 +3 墨墨漠 2026-03-18 3/150 2026-03-21 00:39 by JourneyLucky
[考研] 287求调剂 +7 晨昏线与星海 2026-03-19 8/400 2026-03-20 22:19 by JourneyLucky
[考研] 085600材料与化工 +8 安全上岸! 2026-03-16 8/400 2026-03-20 22:13 by luoyongfeng
[考研] 一志愿西南交通 专硕 材料355 本科双非 求调剂 +5 西南交通专材355 2026-03-19 5/250 2026-03-20 21:10 by JourneyLucky
[考研] 295复试调剂 +8 简木ChuFront 2026-03-19 8/400 2026-03-20 20:44 by zhukairuo
[考研] 0817 化学工程 299分求调剂 有科研经历 有二区文章 +22 rare12345 2026-03-18 22/1100 2026-03-20 20:39 by zhukairuo
[考研] 一志愿北京化工大学0703化学318分,有科研经历,求调剂 +4 一瓶苯甲酸 2026-03-14 4/200 2026-03-20 20:36 by fen_rao
[考研] 295材料求调剂,一志愿武汉理工085601专硕 +5 Charlieyq 2026-03-19 5/250 2026-03-20 20:35 by JourneyLucky
[考研] 工科材料085601 279求调剂 +7 困于星晨 2026-03-17 9/450 2026-03-20 17:38 by 无懈可击111
[考研] 311求调剂 +6 26研0 2026-03-15 6/300 2026-03-18 14:43 by haxia
[考研] 302求调剂 +10 呼呼呼。。。。 2026-03-17 10/500 2026-03-18 12:45 by Linda Hu
[考研] 材料,纺织,生物(0856、0710),化学招生啦 +3 Eember. 2026-03-17 9/450 2026-03-18 10:28 by Eember.
[考研] 304求调剂 +5 素年祭语 2026-03-15 5/250 2026-03-16 17:00 by 我的船我的海
[考研] 0703化学调剂 290分有科研经历,论文在投 +7 腻腻gk 2026-03-14 7/350 2026-03-16 10:12 by houyaoxu
[考研] 0856专硕279求调剂 +5 加油加油!? 2026-03-15 5/250 2026-03-15 11:58 by 2020015
[考研] 080500,材料学硕302分求调剂学校 +4 初识可乐 2026-03-14 5/250 2026-03-14 21:08 by peike
[考研] 中科大材料与化工319求调剂 +3 孟鑫材料 2026-03-14 3/150 2026-03-14 20:10 by ms629
信息提示
请填处理意见