PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 89


# Определение log_base      см выше

$answer = log_base(10,      10, 10_000),

print Iog10(10,100) = $answer\n ,
Iog10(10,000) = 4


84   Глава 2 • Числа

В модуле Math::Complex для вычисления логарифмов по произвольному осно­ванию существует функция logn(), поэтому вы можете написать:

use Math::Complex;

printf "Iog2(1024) = %lf\n", logn(1024, 2); S Обратите внимание

# на порядок аргументов' Iog2(1024) = 10.000000

хотя комплексные числа в вычислениях не используются. Функция не очень эффективна, однако в будущем планируется переписать Math::Complex на С для повышения быстроты.

> Смотри также------------------------------------------------------------------------

Описание функции log вperlfunc(i); документация по стандартному модулю POSIX.

2.14. Умножение матриц

Проблема

Требуется перемножить два двумерных массива. Умножение матриц часто исполь­зуется в математических и инженерных вычислениях.

Решение

Воспользуйтесь модулями PDL с CPAN. Модули PDL (Perl Data Language, то есть «язык данных Perl») содержат быстрые и компактные матричные и математиче­ские функции:

use PDL;

# $а и $b - объекты pdl

$с = $а * $Ь;

Альтернативный вариант — самостоятельно реализовать алгоритм умножения матриц для двумерных массивов:

sub mmult {

my ($m1,$m2) = @_;

my ($m1rows,$m1cols) = matdim($m1);

my ($m2rows,$m2cols) = matdim($m2);

unless ($m1cols == $m2rows) { # Инициировать исключение

die "IndexError: matrices don't match; $m1cols != $m2rows";

my $result = []; my ($i, $], $k),

for $i (range($m1rows)) { for $] (range($m2cols)) { for $k (range($m1cols)) {


2.14. Умножение матриц   85

$result->[$i][$]] += $m1->[$i][$k] ¦ $m2->[$k][$j];

return $result;

sub range {0 .. ($_[0] - 1 }

sub veclen {

my $ary_ref = $_[O];

my type = ref $ary_ref;

if ($type ne "ARRAY") {die "$type is bad array ref for $ary_ref" }

return scalar(@$ary_ref);

sub raatdim {

my $matnx = $_[0];

my $rows = veclen($matnx);

my $cols = veclen($matrix->[0]);




Начало  Назад  Вперед



Книжный магазин