2016-10-31 4 views
0

나는 파일에서 정수 쌍을 읽어서 내가 만든 Point 클래스에 저장하는 프로그램을 가지고있다. 첫 번째 정수는 x 좌표이고 두 번째 정수는 파일의 각 줄에있는 y 좌표입니다. 모든 유효한 포인트의 범위는 [0, 40]이고 범위는 [1, 20] 인 x 좌표이며 입니다.2 차원 배열의 문자 배열

입력 파일은 다음과 같이 데이터를 포함 : 나는 몇 가지 유효성 검사를 수행

enter image description here

내 프로그램이 잘못된 데이터를 무시 또는 범위 데이터에서 수 있도록.

그런 다음 그 점들 위에 회귀선을 그려야합니다. 2 차원 문자 배열을 사용해야하며 Java의 Point2D 클래스 또는 Java의 다른 그래픽 클래스를 사용하는 방식으로이 방법을 사용하는 것을 선호합니다.

"X"들 포인트 나타내는 데 사용되는 "-"회귀 직선 세그먼트 S 및이 선분과 포인트가 같은 지점 *

목에있는 ""s의

enter image description here

# 편집 # 아래

는 대구입니다 : 회귀 라인에 사용되는 공식은 이것이다 이것은 내가 이런 식으로 출력을 원하는 반면 내가 단거리의 코드 :

enter image description here

를 실행 한 후 내 프로그램의 출력입니다

initializeArray(charArray); 
    int xySum = 0; 
    int xSqSum = 0; 
    int xSum = 0; 
    int ySum = 0; 
    for (Point points: point) { 
    xySum += points.getX() * points.getY(); 
    xSqSum += points.getX() * points.getX(); 
    xSum += points.getX(); 
    ySum += points.getY(); 
    } 
    int xMean = xSum/count; 
    int yMean = ySum/count; 
    int n = point.size(); 
    int slope = (xySum - n* xMean * yMean)/(xSqSum - n * xMean * xMean); 

    for (Point points: point) { 
     charArray[points.getX()][points.getY()] = 'X'; 
    } 
    // plot the regression line 
    for (int x = 0; x <charArray.length; x++) { 
     int y = yMean + slope * (x - xMean); // calculate regression value 
     charArray[x][y] = charArray[x][y] == 'X' ? '*' : '-'; 
    } 

: 전자 내가 @sprinter에서 가져온 스 니펫 enter image description here

또한 h입니다. 아야 나는 charArray를 초기화하고 있습니다 :

public static void initializeArray(char[][] charArray) { 
    for(int k =0; k< charArray.length; k++) { 
     for(int d = 0; d<charArray[k].length;d++) { 
     charArray[k][d] = ' '; 
     } 
    } 
} 

이 새로운 출력 : 나는 하드 fillArray 기능을 수행하도록되어 이해하기 위해 찾는거야

enter image description here

+0

큰 문제는 읽을 수 있지만 설명은 작지만 사진에는 많은 공간이 필요합니다. 다시 나는 더 많은 정보를 제공하게되어 기쁘다. – Saad

+0

당신은 슬로프와 yPred를 위해 얻은 것을 인쇄 했습니까? –

+0

예 경사도 값과 yPred 값을 계산합니다. @RAZ_Muh_Taz – Saad

답변

1

. 각 'x'값에 대해 여러 개의 'y'값을 가질 수 있으므로 각 점에 대해이 값을 한 번 호출한다고 가정합니다. 그러나 회귀 선에는 점의 목록에없는 많은 'x'값이 있습니다. 이는 각 회귀 점에 대해 한 번 호출해야한다는 것을 의미합니다. 또한 값을 채운 후에 배열을 반환 할 필요가 없습니다.

경사 계산이 수식과 전혀 일치하지 않는 것 같습니다.이것은 나에게 더 합리적 일 것입니다 :

float xySum = 0; 
float xSqSum = 0; 
float xSum = 0; 
float ySum = 0; 
for (Point point: points) { 
    xySum += point.x * point.y; 
    xSqSum += point.x * point.x; 
    xSum += point.x; 
    ySum += point.y; 
} 
float xMean = xSum/count; 
float yMean = ySum/count; 
float n = points.size(); 
float slope = (xySum - n* xMean * yMean)/(xSqSum - n * xMean * xMean); 

나는 모든 포인트를 플로팅하여 회귀선을 그리는 것이 훨씬 낫다고 생각합니다. 그런데

List<Point> points = ...; 
// first plot the points 
for (Point point: points) { 
    array[point.x][point.y] = 'X'; 
} 
// now plot the regression line 
for (int x = 0; x < 40; x++) { 
    int y = Math.round(yMean + slope * (x - xMean)); 
    array[x][y] = array[x][y] == 'X' ? '*' : '-'; 
} 

, 당신은 당신이 사용할 수있는 자바 (8) 스트림을 잘 알고있는 경우 :

double n = points.size(); 
double xySum = points.stream().mapToDouble(p -> p.x * p.y).sum(); 
double xSqSum = points.stream().mapToDouble(p -> p.x * p.x).sum(); 
double xMean = points.stream().mapToDouble(p -> p.x).sum()/n; 
double yMean = points.stream().mapToDouble(p -> p.y).sum()/n; 

마지막으로, 당신의 X 치수 제 1 및 Y 치수 초입니다. 따라서 인쇄하기 위해서는 x가 아닌 y를 먼저 반복해야합니다.

for (int y = 0; y < 20; y++) { 
    for (int x = 0; x < 40; x++) { 
     System.out.print(array[x][20-y-1]); 
    } 
    System.out.println(); 
} 
+0

하지만 포인트의 위에 회귀선을 그려야합니다, 당신의 방법으로 가능할까요? – Saad

+0

이것은 회귀선을 점의 꼭대기에 표시합니다. – sprinter

+0

방금 ​​내 프로그램에 코드를 복사했지만 출력에는 여전히 문제가 있습니다. 내가 그림을 올리 길 원하면 알려줘. "-"문자는 여전히 위에 게시 된 첫 번째 그림과 같습니다. 그들은 같은 지점에서 서로 겹쳐 쌓여 있습니다. 또한 "*"가 출력에 표시되지 않습니다. @sprinter – Saad