2013-06-06 2 views
0

У меня есть двузначная диагональная матрица, хранящаяся в текстовом файле.rounding double in java

size(file)~410 Mo 

Я хотел бы уменьшить размер, округляя свои двойные значения.

Если сво хорошая идея, как сделать это в Java

0.1706524958886193=>0.17 

мне нужно использовать этот файл позже в MATLAB

при попытке

dlmread (файл) я выйти ошибки памяти

+1

Храните ли вы этот файл в виде текста или как прямой бинарный файл? –

+0

как текст файла (.txt) // Мне нужно использовать его позже в программе matlab. – nawara

+0

Просто используйте, например. [ 'Printf'] (http://docs.oracle.com/javase/1.5.0/docs/api/java/io/PrintStream.html#printf%28java.lang.String,%20java.lang.Object .. .% 29) для форматирования по мере необходимости. –

ответ

5

Если вокруг значений вы выбрасывая точность , Это может изменить результаты, которые вы получите.

Лучше всего хранить только диагональные элементы. Нет смысла хранить n^2-n недиагональных нулей. Используйте функцию diag для преобразования вектора в диагональную матрицу. http://www.mathworks.es/es/help/matlab/ref/diag.html

Еще эффективнее: хранить номера в двоичном формате вместо текста.

+0

+1, потому что я согласен, что уменьшение до 2 десятичных знаков может привести к изменению результатов. – Schorsch

+0

отличная идея, но ... та же проблема с функцией diag = out of memory – nawara

+0

Тогда матрица просто слишком велика для обработки с памятью, которая в настоящее время назначена Matlab. Там есть страница с информацией о том, как дать Matlab больше памяти и советы о том, как уменьшить потребление памяти здесь: http://www.mathworks.es/es/help/matlab/matlab_prog/resolving-out-of-memory-errors.html – Joni

2

Используйте класс DecimalFormat для форматирования значения double в соответствии с вашими потребностями. Например, если вы хотите сохранить только 2 цифры после использования десятичной точки, "#0.00 и так далее. DecimalFormat#format класс возвращает String вывод, который вы можете использовать для создания значения Double. от

import java.text.DecimalFormat; 
public class Tester 
{ 
    public static void main(String arg[]) throws Throwable 
    { 
    double bigDouble=0.1706524958886193; 
    DecimalFormat df=new DecimalFormat("#0.00"); 
    String numberString=df.format(bigDouble); 
    double smallDouble=new Double(numberString); 
    System.out.println(smallDouble); 
    } 
} 

Надеется, что это помогает ...

+0

+1 Как это лучшее решение для округлых чисел. – eternay

+0

+1 и, пожалуйста, добавьте реализованные методы в [NumberFormat] (http://stackoverflow.com/a/8582656/714968), в противном случае вы должны использовать BigDecimal – mKorbel

+0

[true is] (http://stackoverflow.com/a/7553827/714968) by @EJP – mKorbel

0

Если я не буду недопониманием вопроса, который вы можете сделать это следующим образом:

double value = 0.1706524958886193; 
value = (double)((int)(value*100))/100; // returns 0.17 
+0

Это будет усечение. Кажется, что искатель хочет округлить –

+0

. В большинстве случаев это не даст «точный» результат ... –