24小时热门版块排行榜    

CyRhmU.jpeg
查看: 205  |  回复: 3
当前主题已经存档。

quartzbj

金虫 (正式写手)

[交流] 【讨论】矩阵部分数赋值问题?

一个矩阵A:
4   5     16     17   18   9  
2   20   30    40   9     0
3   20    8      6    7     0
31  40  18    8    19    6
1    83    2      6   7    18



希望把矩阵A大于10的数先挑出来赋值为1,其它为0,

第二步, 但是如果同一行连续有两个1, 就把原来矩阵A中相应数比较小的再赋值为0,不连续的点保持不变。

第三步,如果某个1周围8个点都为0,把原来矩阵A中对应数比较大的再赋值为1.

老是循环使用不好,怎么办?

[ Last edited by quartzbj on 2009-11-18 at 08:54 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zjliu1265

至尊木虫 (正式写手)

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
kuhailangyu(金币+2,VIP+0):谢谢参与 11-18 11:11
第一步不用循环容易实现,但是后面两步不用循环比较麻烦。
其实循环也不是不好,我个人认为写程序首要的是写出来准确
的程序,其次才是去优化程序。

顺便问一下,你的问题是和元胞自动机相关么?

我写了一段程序如下,仅供参考:

A=[4,5,16,17,18,9;...
        2,20,30,40,9,0;...
        3,20,8,6,7,0;...
        31,40,18,8,19,6;...
        1,83,2,6,7,18];

% step 1
Ao=A;
A(A<=10)=0;
A(A>10)=1;
A
% step 2
[x,y]=find([A(1:end-1,+A(2:end,]>1.5);
Ix1=sub2ind(size(A),x,y);
Ix2=sub2ind(size(A),x,y+1);
Ix1,Ix2
[xx,Ix]=min([Ao(Ix1),Ao(Ix2)],[],1);
Ao(Ix1(Ix<1.5))=0;
Ao(Ix2(Ix>1.5))=0;

% step 3
S=A(1:end-2,2:end-1)+A(3:end,2:end-1)+...
    A(2:end-1,1:end-2)+A(2:end-1,3:end)+...
    A(1:end-2,1:end-2)+A(3:end,1:end-2)+...
    A(1:end-2,3:end)+A(3:end,3:end);
[x,y]=find(S<0.5);
dx=[-1,0,1,-1,1,-1,0,1];
dy=[-1,-1,-1,0,0,1,1,1];
for k=1:length(x);
    xn=x(k)+dx;
    yn=y(k)+dy;
    Ix=sub2ind(size(Ao),xn,yn);
    [xx,Ik]=max(Ao(Ix));
    Ao(Ix(Ik))=1;
end

[ Last edited by zjliu1265 on 2009-11-18 at 11:04 ]
2楼2009-11-18 11:02:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

quartzbj

金虫 (正式写手)

谢谢,想做边界检测
3楼2009-11-18 18:46:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

hitzhang

木虫 (正式写手)

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
sunxiao(金币+2,VIP+0):谢谢专家 11-19 01:00
引用回帖:
Originally posted by quartzbj at 2009-11-18 18:46:
谢谢,想做边界检测

第二步只针对行吗?碰到3个4个连续的怎么办?第三步只针对矩阵内部的格点吗?对于矩阵边界上的格点,周围只有3个或5个的怎么办?老是循环是什么意思?
4楼2009-11-18 21:06:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 quartzbj 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见