VimIy微民网,让世界倾听微民的声音! 设为首页 | 加入收藏 | 网站地图
当前位置:主页 > 大杂烩 >

【微民网码农多】 【你们最专业】哪位帮帮忙,想一个2个矩阵相乘的算法。

整理时间:2013-01-23 05:24 来源:www.vimiy.com 作者:编辑 点击:

【楼主】(11919302)2013-01-20 20:12

» 哪位帮帮忙,想一个2个矩阵相乘的算法。
    嗯,苦逼LZ写了个matlab程序,运行了5分钟了,还没出结果。抓狂中。。。
    
    业余瞎鼓捣,非专业,求勿喷。。。我是学电气的,写程序真心捉急。。。
    
    程序就是求一个n*n的小矩阵和一个m*m的大矩阵进行运算,小矩阵开始在大矩阵的左上角,就是2个矩阵的(1,1)位置重合,然后小矩阵的各个数和大矩阵对应的数相乘,将得到的n*n个乘积求和,得到的结果判断是否大于一个阈值,如果大于,将左上角的坐标存放在一个空矩阵中。然后小矩阵在大矩阵对应的横坐标+1,横坐标到头了,纵坐标+1,一直算下去,相当于逐行逐列扫描。我用了4层for和1个if,感觉很不靠谱啊。
    
    这是给厂里做的一个检测棒子数量的程序,做了很久,也没人帮我,好难过~~
    
    程序在此:前面是生成一个环形模板,后面用该模板游荡,计算匹配值。
    
    clear all;
    close all;
    clc;
    r=100;
    r1=floor(r*1.2);
    r2=floor(r*0.8);
    a1 = strel('disk',r1);
    b1 = getnhood(a1);
    %b1=double(b1);
    a2 = strel('disk',r2);
    b2 = getnhood(a2);
    %b2=double(b2);
    =size(b1);
    =size(b2);
    c=zeros(m1,n1);
    mm1=(m1-m2)/2+1;
    mm2=mm1+m2-1;
    % nn1=(n1-n2)/2; % 因为是正方形,所以mm1=nn1
    % nn2=nn1+n2;
    for i=mm1:mm2
     for j=mm1:mm2
     c(i,j)=b2((i-mm1+1),(j-mm1+1))
     end
    end
    cc=b1-c;
    %%%%%%环形矩阵生成完毕%%%%%%%%%%%%%%%%%%%%
    f=imread('22.jpg');
    f=rgb2gray(f);
    =size(f);
    z=zeros(row,col);
    zz=0;
    for ii=1:row-m1-1
     for jj=1:col-n1-1
     for ii1=1:m1
     for jj1=1:n1
     zz=cc(ii1,jj1)*f(ii,jj)
     if zz>100
     z(ii,jj)=255
     end
     end
     end
     end
    end
    z=im2bw(z,1);
    figure(1);imshow(z);
    
网友评论(6655040)2013-01-20 20:13


    。。。你需要自己写具体内部怎么算么。。。
    
    matlab大把矩阵运算啊。。。直接在help找matrix
    
网友评论(11919302)2013-01-20 20:17


    Reply to Reply Post by 淡淡存在,轻轻叫嚣 (2013-01-20 20:13)
    
    我就是找不到应该用哪个函数啊,百度了很久也没人说起这个,help不知道应该输入啥……
    
    线性代数扔给老师了。。。线代里有这个运算么?
    
    
    


网友评论(554733)2013-01-20 20:18


    矩阵要用点乘啊,命令是A.*B,得到的结果是AB对应元素相乘的结果,这样应该能省掉不少计算
    
网友评论(6655040)2013-01-20 20:21


    Reply Post by 冯·斯特劳茨 (2013-01-20 20:17):
    
    我就是找不到应该用哪个函数啊,百度了很久也没人说起这个,help不知道应该输入啥……
    
    线性代数扔给老师了。。。线代里有这个运算么?
    
    
    
    http://www.mathworks.se/help/matlab/ref/eye.html
    
    http://www.mathworks.se/help/matlab/ref/lu.html
    
    别问我啊~~我最讨厌线性了~我随便找的~~~你自个进去找找吧~
    


网友评论(311070)2013-01-20 20:23


    这个可不是矩阵的点乘吧
    
网友评论(11919302)2013-01-20 20:25


    Reply to Reply Post by 淡淡存在,轻轻叫嚣 (2013-01-20 20:21)
    
    好吧,默默地打开金山词霸……
    
网友评论(6655040)2013-01-20 20:26


    Reply to Reply Post by 冯·斯特劳茨 (2013-01-20 20:25)
    
    其实我压根没看你具体的内容啊,不过这确实需要用矩阵么?
    
网友评论(11919302)2013-01-20 20:30


    Reply to Reply Post by 淡淡存在,轻轻叫嚣 (2013-01-20 20:26)
    
    就是说我建立了一个小矩阵当做模板,在大矩阵中扫描,寻找能和该模板匹配的图形。这个必须要矩阵运算了吧……
    
网友评论(942161)2013-01-20 20:31


    动态规划可破?
    不过复杂度还是很高的好像
    
    好吧我是个半吊子逗比
    
网友评论(6655040)2013-01-20 20:32


    Reply to Reply Post by 冯·斯特劳茨 (2013-01-20 20:30)
    
    这。。。我还不如存一组数,这组数例如是12345,然后我在你需要的目标数组里寻找前后连续的带12345这5个数字的。然后再进行一个顺序的对比,对比ok的话就说明找到了。。。这样不行么?
    
网友评论(1986182)2013-01-20 20:34


    MATLAB不会.IDL倒是比较简单可以实现...
    
网友评论(11919302)2013-01-20 20:34


    Reply to Reply Post by 淡淡存在,轻轻叫嚣 (2013-01-20 20:32)
    
    我处理的是二值图像,要么是0,要么是1,需要在图像中找出来几十个圆形,并求出各自的圆心,就是0和1组成的矩阵。我给你上一张图。
    
    
    

网友评论(1293765)2013-01-20 20:35


    实际上n中的每一个数都要和m中的每一个数乘一遍是吧,总共有m个结果
    
    
    没有什么简单的办法好像
    
网友评论(433307)2013-01-20 20:36


    google一下 convolution
    ----sent from my samsung GT-I9308,Android 4.0.4
    
网友评论(11919302)2013-01-20 20:36


    Reply to Reply Post by nightzsze (2013-01-20 20:35)
    
    我觉得也是,就是感觉好蛋疼……刚才一直在运行,就是不出结果。这计算量感觉有点大。
    
网友评论(1392279)2013-01-20 20:38


    n*n*m*m暴力
    如果要优化的话就把n*n里的值先排序了 从大到小取 超过那个值就直接把坐标放进去 不用继续乘了
    
网友评论(11919302)2013-01-20 20:43


    Reply to Reply Post by 做做日常 (2013-01-20 20:38)
    
    额,这个办法好,3q。但是大矩阵中大量的计算是无用的,只有很少的有用部分这样优化才有效果。还是谢了~
    
网友评论(6655040)2013-01-20 20:43


    Reply to Reply Post by 冯·斯特劳茨 (2013-01-20 20:36)
    
    看了你的图我就更加不理解了-。-能解释清楚点吗。。。
    
网友评论(11919302)2013-01-20 20:48


    Reply to Reply Post by 淡淡存在,轻轻叫嚣 (2013-01-20 20:43)
    
    就好比你做了一个环形的纸板,大小跟图中这些圆差不多,然后从左上角开始逐行逐列扫描,当环形纸板把某个圆完全挡住的时候,记录下此时环形纸板的中心坐标,也就对应了这个圆的圆心坐标。
    
    环形纸板就是n*n的小矩阵。
    
    怎么确定纸板正好盖住圆形呢?就要用小矩阵和被纸板盖住的那一部分大矩阵的数相乘,因为只有0和1,所以和圆环模板重合的圆形部分相乘结果才是1,然后判断相乘后n*n阶矩阵所有的数的和,大于某个阈值,就判断为圆形正好被环形模板覆盖了。
    
    说的有点乱,语死早,我也说不太明白……
    
    这个程序的目的就是为了检测出来所有圆的圆心位置。
    




    
    
    

关于网站 | 网站声明 | 用户反馈 | 合作伙伴 | 联系我们
Copyright © 2012年2月8日