声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1536|回复: 13

[编程技巧] 如何通过已知参数产生椭圆矩阵

[复制链接]
发表于 2007-10-21 15:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
如何产生一椭圆矩阵,在椭圆内部值1,在外部为0,椭圆参数知道(长轴,短轴,,角度),谢谢!

[ 本帖最后由 eight 于 2007-10-21 23:23 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-10-21 16:05 | 显示全部楼层
如果没有好办法,就直接赋值吧
发表于 2007-10-21 18:07 | 显示全部楼层
试了下,最笨的方法,也是最直接的方法
  1. clear,clc;
  2. N=111;A=ones(N);o=floor((N+1)/2);
  3. for i=1:N
  4.   for j=1:N
  5.     if ((i-o)^2/9+(j-o)^2/16)>10^2
  6.         A(i,j)=0;
  7.     end
  8.    end
  9. end
  10. imshow(A)
复制代码

[ 本帖最后由 花如月 于 2007-10-21 18:09 编辑 ]
temp.PNG

评分

1

查看全部评分

 楼主| 发表于 2007-10-21 18:14 | 显示全部楼层

不错,可惜

可是我还有个参数,带角度的,希望不用循环,实现的话万分感谢
 楼主| 发表于 2007-10-22 14:09 | 显示全部楼层

采用循环的方法。

如果采用花如月 的方法代码可以如下修改:
function A= EliMatrix(N,R1,R2,r,alpha)

A=ones(N);o=floor((N+1)/2);
for i=1:N
  for j=1:N
x=i-o;
y=j-o;
c1=cos(alpha)^2/R1^2+sin(alpha)^2/R2^2;
c2=sin(2*alpha)/R1^2-sin(2*alpha)/R2^2;
c3=sin(alpha)^2/R1^2+cos(alpha)^2/R2^2;
if (c1*x^2+c2*x*y+c3*y^2)>r^2
        A(i,j)=0;
    end
   end
end
imshow(A)
在双核处理下时间为0.35秒,时间太长,这只是一个mask而已,所以寻求不是循环的,另外还要解决矩阵与椭圆外切的关系,进行中。。。
发表于 2007-10-22 14:13 | 显示全部楼层
一步一步来吧,欢迎分享你的解决办法
发表于 2007-10-22 21:00 | 显示全部楼层
原帖由 ll710915 于 2007-10-22 14:09 发表
如果采用花如月 的方法代码可以如下修改:
function A= EliMatrix(N,R1,R2,r,alpha)

A=ones(N);o=floor((N+1)/2);
for i=1:N
  for j=1:N
x=i-o;
y=j-o;
c1=cos(alpha)^2/R1^2+sin(alpha)^2/R2^2;
c2 ...


自行按照“矢量化编程技巧”的帖子(置顶帖可以找到)修改一下即可去掉所有循环
发表于 2007-10-23 15:26 | 显示全部楼层
看来我太愚钝了,怎么我看来了2遍矢量化编程。
还是没有找到去掉循环的办法
发表于 2007-10-23 15:45 | 显示全部楼层
原帖由 花如月 于 2007-10-23 15:26 发表
看来我太愚钝了,怎么我看来了2遍矢量化编程。
还是没有找到去掉循环的办法

c1,c2,c3值是固定的,条件判断 if 中 r 也是固定的,只有 x、y 是可变的,A 随着 x、y 的改变有不同的取值,这就可以摆脱循环
发表于 2007-10-23 15:53 | 显示全部楼层
依然没有看出去掉所有循环的办法:@L
发表于 2007-10-23 16:30 | 显示全部楼层
原帖由 花如月 于 2007-10-23 15:53 发表
依然没有看出去掉所有循环的办法:@L

  1. clear,clc;
  2. N=1024;C=ones(N);o=floor((N+1)/2);
  3. X=repmat([1:N]',1,N);
  4. Y=repmat(1:N,N,1);
  5. C(((X-o).^2/9+(Y-o).^2/16)>10^2) = 0;
  6. imshow(C)
复制代码
两个 repmat 语句可以用一个 meshgrid 语句代替


速度比较:
speed.bmp

[ 本帖最后由 eight 于 2007-10-23 16:58 编辑 ]

评分

1

查看全部评分

发表于 2007-10-23 16:56 | 显示全部楼层
忽然想起来,曾经见到过这种用法。当时不太理解,所以不会用。eight总是能给人惊喜,再次感谢!
 楼主| 发表于 2007-10-24 14:29 | 显示全部楼层

thx

谢谢!
 楼主| 发表于 2007-10-24 14:51 | 显示全部楼层

code

function A= EliMatrix(R1,R2,r,alpha)
N=2*max(R1,R2)*r;
A=ones(N);o=floor((N+1)/2);
c1=cos(alpha)^2/R1^2+sin(alpha)^2/R2^2;
c2=sin(2*alpha)/R1^2-sin(2*alpha)/R2^2;
c3=sin(alpha)^2/R1^2+cos(alpha)^2/R2^2;
X=repmat([1:N]',1,N);
Y=repmat(1:N,N,1);
A((c1*(X-o).^2+c2.*(X-o).*(Y-o)+c3*(Y-o).^2)>r^2)=0;
imshow(A)

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-20 08:54 , Processed in 0.066934 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表