2013-02-04 1 views
2

Matlab에서 다음 함수를 구현했습니다.이 루프 대신 cellfun 또는 arrayfun을 어떻게 사용할 수 있습니까?

function [x y] = cloud(a,b,phi,x0,y0,N) 
phi=phi*2*pi/360; 
m=ceil(5*N/pi); 
x=a*(-1+2*rand(m,1)); 
y=b*(-1+2*rand(m,1)); 
f=sqrt(a^2 - b^2); 
indexMatrix=zeros(m,3); 
indexMatrix(:,1)=x; 
indexMatrix(:,2)=y; 
insidePointsMatrix=zeros(1,2); 
j=1; 
for i=1:m 
    insidePoint=sqrt(((x(i)+f).^2) + (y(i))^2) + sqrt(((x(i)-f).^2) + (y(i))^2); 
    if (insidePoint<=2*a) 
     indexMatrix(i,3)=1; 
     %insidePointsMatrix(j,:)=indexMatrix(i,1:2); 
     if j<=N 
      insidePointsMatrix(j,1:2)=indexMatrix(i,1:2); 
      j=j+1; 
     end 
    end 
end 

나는 약 arrayfuncellfun을 읽고있다, 그리고 나는 이미 그것을 사용하여 구현하는 기능을 단축 할 수 있는지 궁금하고있다. 주어진 2 x n 행렬 A 여기서 (u, v)는 주어진 행에 대한 항목입니다. 각 행에 대해 다음 수식의 출력을 나열하는 행렬을 어떻게 반환 할 수 있습니까?

sqrt((u+f).^2+v.^2) + sqrt((u-v)^2+v^2) 

변수 fa은 상기 정의된다. 일련의 점을 타원으로 변환하려고합니다.

답변

2

find를 사용하여 당신에게 제공한다 u,v 좌표 :

cond=sqrt(((x+f).^2) + y.^2) + sqrt(((x-f).^2) + y.^2) ; 
ind=find(cond<=2*a); 
u=x(ind); 
v=y(ind); 
관련 문제