24小时热门版块排行榜    

查看: 1455  |  回复: 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的回帖
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 什么时候开奖? +4 CrisMessi 2026-08-18 4/200 2026-08-19 00:53 by gatelove
[基金申请] 咱们一起用铁证分析2026国家社科基金中标与否 +7 启萌科技 2026-08-12 27/1350 2026-08-18 21:44 by Noways
[基金申请] 2027广东省杰青 +3 奶牛小黑 2026-08-15 9/450 2026-08-18 20:09 by 奶牛小黑
[基金申请] 朋友圈看到的 +4 wangzilk 2026-08-18 5/250 2026-08-18 19:25 by wangzilk
[基金申请] 欢迎发来filecode的Mz6后的代码验证其规律 +51 医学老男孩 2026-08-13 110/5500 2026-08-18 19:07 by icerianxia
[基金申请] 明天放榜? +5 Shxjjxjkx 2026-08-18 5/250 2026-08-18 18:14 by -大大大大大-
[基金申请] 时间戳变了,能看出什么问题? +8 基诺咪客 2026-08-17 11/550 2026-08-18 17:13 by 悠然熊猫
[基金申请] 重要消息,中午系统在维护 +9 yuleib84 2026-08-18 10/500 2026-08-18 16:52 by archvillain
[论文投稿] 投稿咨询 +4 wwm09 2026-08-17 6/300 2026-08-18 15:36 by wwm09
[基金申请] 时间戳又变了8-15 +14 archvillain 2026-08-15 26/1300 2026-08-18 13:37 by phantomgost
[基金申请] 今天维护系统维护 祝所有人 高中 +8 gjjjzhong 2026-08-18 9/450 2026-08-18 13:01 by 家与远方
[基金申请] 哪位老哥知道今年的国自然具体哪一天放榜? +13 Ldrop2023 2026-08-13 16/800 2026-08-18 12:25 by 淀粉搬运工
[基金申请] 快农历七夕节了,轻松一下,男人悄悄话,女施主请不要进来。 +4 Tide man 2026-08-14 5/250 2026-08-18 11:35 by Tide man
[基金申请] 感觉是下周放榜了 +6 angus9576 2026-08-17 11/550 2026-08-17 23:57 by angus9576
[基金申请] filecode=后面第一个是大写字母 +8 wangze12014 2026-08-14 10/500 2026-08-17 17:05 by xter9665
[精细化工] 招聘 金属平磨液,抛光液研发工程师 +3 小天0311 2026-08-14 3/150 2026-08-16 07:31 by H9PLUS
[基金申请] 重要来源:本周末出结果 +10 瞬息宇宙 2026-08-12 10/500 2026-08-13 15:46 by likettle
[基金申请] 不应该看fileCode +7 且听虎啸 2026-08-12 9/450 2026-08-13 14:27 by flydreamws
[基金申请] Filecode 又变了,巨变 +3 WH3796 2026-08-12 4/200 2026-08-13 14:13 by 小木虫6752397
[基金申请] 结合人工智能,周易传统文化,filecode打分制来了,3分以上希望很大。 +3 Tide man 2026-08-12 4/200 2026-08-13 08:35 by ZJTJZ
信息提示
请填处理意见