2013-11-21 4 views
1

3 벡터의 데이터를 사용하여 표면 플롯을 수행 할 수 있어야합니다. 비슷한 정보를 찾았지만 내 데이터로는 아무런 방법도 작동하지 않습니다. 내 X와 Y 열은 균등하게 배열되어 있지만 증가하지는 않습니다. 나는 다른 방법을 시도했지만, 그들 중 누구도 내가 원하는 것을 나에게주는 것 같지 않습니다. 그것은 가까운 지점을 연결하는 간단한 표면입니다.3 벡터가있는 표면 플롯 Matlab

[X Y]=meshgrid(x,y); 
Z=griddata(x,y,z, X,Y); 
surf(X,Y,Z); 

은 Z = 0에서 표면을 생성하고 더 많은 단지 표면보다 볼륨 음모처럼 보이게하기 때문에, 내가 원하는 것을 정확히되지 않습니다 : 나는 다음 시도했다. 또한 내 컴퓨터에서 매우 천천히 실행됩니다 (아마도 모든 격자 점을 생성하는 것으로부터). 많은 메모리를 필요로하지 않는 무언가를 얻을 수 있다면 이상적입니다 (내 벡터는 약 20k 값을가집니다). 그러나 이것은 꼭 필요한 것은 아닙니다.

*** 편집 : 나는 또한 scatteredInterpolant 방법은 here을 발견 사용했지만, 함수는 MATLAB에서 인식하지 않는 것 그리고이 오류 얻을 : 또한 여기의 이미지입니다

Undefined function 'scatteredInterpolant' for input arguments of type 'double'. 

을 내 문제 : here

우리는 표면 아래에서 볼 수 없으며 일부 z = 0 평면이 그것을 차단하고 있음을 알 수 있습니다.

나를 위해 필요한 것이 있다면 도움을 주시면 감사하겠습니다.

미리 감사드립니다.

** 편집 2 : 샘플 vectors을 추가했는데, 왼쪽에서 오른쪽으로 x, y 및 z 값을가집니다.

*** 편집 3 다음은 내가 얻은 삼각 측량의 이미지입니다. 당신이 볼 수 있듯이, 몇 가지 이유가 무엇인지는 무시되고 있습니다. 길고 이상한 파란 삼각형을 그리게됩니다. 마이크

+0

figure 2 (sorted plot)가 도움이됩니까 : figure 1 (unsorted plot)

두 번째 그림은 원하는 표면을 포함? 아니면'doc griddata'에 설명 된 다른'method'를 사용한다면 어떨까요? 그렇지 않으면 문제를 완전히 복제하기 위해 몇 가지 샘플 코드와 벡터를 게시하십시오. –

+0

@DennisJaheruddin Z (~ Z) = NaN 할 때 [더 평평한 바닥] (http://imgur.com/qg8PMOm)을 볼 수 있지만 여전히 볼 수는 없으며 닫히고 볼륨을 형성합니다. 내 벡터는 아주 크고, 나는 그들을 연결하는 방법을 찾으려고 노력할 것이다. –

+0

데이터에 플롯 된 낮은 값이 실제로 포함되어 있지 않습니까? x와 y 값이 0.8과 1.2 사이에있는 최소 z는 얼마입니까? 또한 다른 그리드 데이터 옵션을 사용하는 것을 잊지 마십시오. –

답변

1

당신이 벡터에 의해 설명되는 점을 가지고, 당신은 항상 Delauny 삼각를 사용할 수를 플롯하려면

. matlab의 함수는 Tri=delauny(X,Y,Z)입니다. 이 기능으로 생성 된 데이터는 또는 trisurf(Tri,X,Y,Z)으로 표시 할 수 있습니다. trisurf는 3D 데이터에만 사용됩니다. 그래프에서 플롯의 투명도를 조정하려면 alpha 설정을 사용하십시오.

나는 기존의 방법이 실패하는 것, 나는 당신이 수동으로 할 제안이

+0

내 데이터에서 삼각형을 시도한 후, [이]처럼 보이는 것을 얻습니다 (http://imgur.com/Nj8U08g). 표면 아래에서 교차하는 선들을 볼 수 있습니다. trisurf는 좋아 보인다. 그러나 나는 z = 0에서 그 비행기를 얻는다. 나는 trimesh에서 볼 수있는 라인에서 추측하고있다. –

+0

느린 답변에 죄송합니다. 주말에 나갔습니다. 만약 당신이 올바르게 이해한다면 z = 0 평면에서 삼각형을 없애기를 원할 것입니다. 이 영역을 설명하는 삼각형을 식별하면 쉽게 수행 할 수 있습니다. trisurf 명령은 특정 삼각형을 벡터 (도움말에서와 같이 C라고 부름), trisurf (Tri, X, Y, Z, C)로 채색하는 옵션이 있습니다. C를 사용하면 특정 삼각형을 찾아 식별 할 수 있습니다. 식별되면 새로운 배열 Tri2를 만듭니다.이 배열은 문제가되는 삼각형이없는 Tri와 같습니다. 다음 trisurf를하십시오 (Tri2, X, Y, Z). 약간은 어색하지만 삼각형을 예측하는 것은 어렵습니다. – Martin

+0

다른 일반적인 방법은 각 삼각형의 모든 꼭지점의 z 구성 요소를 테스트하는 알고리즘을 작성하는 것입니다. 모든 정점이 z 구성 요소 = 0이면 z = 0 평면을 나타내며 제거 할 수 있습니다. – Martin

1

도움이되기를 바랍니다.

  1. NaN 값으로 가득 찬 행렬 Z을 만듭니다. 행렬의 크기는 xy 값에 따라 달라집니다.
  2. 루프가 모두 발생하는 경우 x, y 쌍이 있고 Z 행렬의 오른쪽 위치에 (평균?) z 값이 입력됩니다.
  3. 모든 루프를 통해 NaN 값과 그 값을 보간합니다. 아마도 filter2을 사용했을 것입니다.
  4. 사용 surf 방금 ​​음모를 꾸미고하기 전에 데이터를 정렬해야 할 것 같습니다 나에게 그 결과 표면
+0

답변 해 주셔서 감사합니다. 나는 정말로 그다지 따르지 않는다, 당신은 무엇을 의미한다 "바른 위치에 그들의 z 가치를 둬라"? 내 벡터 x, y, z는 이미 (x (i), y (i), z (i))가 내가 음모를 꾸미고 싶은 점을 형성하도록 정렬되어있다. 또한 정의에 의해 값이없는 경우 어떻게 NaN 값을 보간 할 수 있습니까? 다시 한번 감사 드리며 매우 감사드립니다. –

+0

@MikeNelson 내가 말하고자했던 것은 : griddata 접근법은 발생하는 값과 보간으로 구성된'Z' 매트릭스를 생성합니다. 어떻게 든이 행렬을 직접 만들어보십시오. 아마도 발생하는 값으로 시작한 다음 자신 만의 보간을하는 것입니다. –

1

을 플롯합니다.

다음은 귀하의 사례와 유사하다고 생각되는 사례입니다 (귀하의 데이터를 다운로드 할 수 없었기 때문에). 매우 문제가 표면에

x = [2 1 4 3 -1 -3 -4 -2]; 
y = [1 2 3 4 -1 -2 -3 -4]; 
z = 32 - x.*x - y.*y; 

[X1 Y1] = meshgrid(x,y); 
Z1 = 32 - X1.*X1 -Y1.*Y1; 
surf(X1,Y1,Z1) 

aux = sort([x;y],2); 
x = aux(1,:); 
y = aux(2,:); 

[X2 Y2] = meshgrid(x,y); 

Z2 = 32 - X.*X - Y.*Y; 
figure() 
surf(X2,Y2,Z2) 

첫 번째 그림 결과 : 당신은`Z (~ Z) = NaN`을 할 경우