2015-05-15 4 views
-1

Я пытаюсь использовать пакет Normalize, но у меня есть данные в массивах (@x), а не в некоторых указывающих массивах, которые пакет требует для нормализации.Как преобразовать массив в этот указательный массив в Perl?

Требуются формат данных в массиве указывающего, как хэш

my %xx = ('1' => 22.595451, '2' => 20.089094, '3' => 17.380813); 

Текущий формат данных

my @x = qw/22.595451 20.089094 17.380813/; 

т.е. ('22.595451', '20.089094', '17.380813').

Как вы можете преобразовать данные в отображающую структуру данных?

+2

Некоторые ресурсы, которые могут быть полезны: [базовые типы данных, три] (http://www.perlmonks.org/?node_id=861) на PerlMonks; ['perldoc perldata'] (http://perldoc.perl.org/perldata.html). – ThisSuitIsBlackNot

+0

[Как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask) –

+1

Кроме того, с удвоением IEEE-754 «... дайте 15-17 значащих десятичных цифр. десятичная строка длиной не более 15 значащих цифр преобразуется в представление двойной точности IEEE 754, а затем преобразуется обратно в строку с тем же числом значащих цифр, тогда конечная строка должна соответствовать оригиналу. Если двойная точность IEEE 754 преобразуется в десятичная строка с не менее 17 значащими цифрами, а затем преобразованная обратно в двойную, то окончательное число должно соответствовать оригиналу ». OTOH, если какие-либо операции связаны с разными величинами, последние цифры начинают терять смысл. –

ответ

2

Вы можете передать массив по ссылке, вместо использования хэша. Как это

use strict; 
use warnings; 

use Normalize; 

my @x = qw/ 22.595451 20.089094 17.380813 /; 

my $norm = Normalize->new(round_to => 1e-16); 

$norm->normalize_to_max(\@x); 

print "$_\n" for @x; 

, которые нормализуют содержание @x вместо

+1

@Masi: вам нужно создать объект '$ norm', как описано в документации, которую вы ссылаетесь на' my $ norm = Normalize-> new' – Borodin

+1

@Masi: вы вряд ли будете лучше 12 значимых цифр, но можете установите округление при создании объекта с помощью «Нормализовать-> новый (round_to => 1e-16)» – Borodin

+0

У меня есть некоторые проблемы с этой нормализацией - это не оптимально. Он нормализует первое значение до 1.0000 ... Как лучше нормализовать нормализацию? Моя собственная нормализация устанавливает первое значение '0.982698386894082' вместо того, чтобы давать гораздо более оптимальный результат. Я думаю, мне нужно добавить смещение и умножение. Любой способ по умолчанию для этого о том, как действовать? –

2

Фактическое имя для того, что вы называете «указывающего массив» является хэш, который представляет собой тип ассоциативного массива.

my %xx; $xx{$_} = $x[$_] for 0..$#x; 

-или-

my %xx = map { $_ => $x[$_] } 0..$#x; 

Это говорит, Бородин отметил, что функции этого модуля принимает ссылку на массив, а также ссылку на хэш. Это означает, что вам не нужно делать

my %xx = map { $_ => $x[$_] } 0..$#x; 
$norm->normalize_to_max(\%xx); 

, так как вы можете просто сделать

$norm->normalize_to_max(\@x); 
2

Самый простой способ преобразовать массив в хэш.

my %hash; 
@hash{ keys @array } = values @array; 
Смежные вопросы