подпрограмма для генерации 2d массива из двух 1d массивов и функции - PullRequest
1 голос
/ 06 апреля 2010

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

Пример псевдокода того, что я хотел бы сделать:

function foo(a, b) {
  return a * b  // EG
}

a = [ 1, 2, 3 ]
b = [ 4, 5, 6 ]
matrix = the_function_for_which_I_search(foo, [a, b] )
print matrix
=> [ [ 4, 8, 12], [5, 10, 15], [6, 12, 18] ]

// or
function concatenate(a,b)
  return a.b
}
print the_function_for_which_I_search( concatenate, [ a, b ])
=> [ [ '14', '24', '34'], ['15', '25', '35'], [16', '26', '36'] ]

Другими словами, function_for_which_I_search будет применять функцию, заданную в качестве первого аргумента, к каждой комбинации элементов двух массивов, передаваемых в качестве второго аргумента, и возвращать результаты в виде двумерного массива.

Я хотел бы знать, имеет ли такая подпрограмма общее имя, и доступна ли она в модуле python, пакете cpan, ruby ​​gem, пакете pear и т. Д. Мне также интересно, является ли это основной функцией в других языки, возможно haskell или R?

Ответы [ 3 ]

0 голосов
/ 06 апреля 2010

Звучит так, будто вы ищете умножение матриц. Посмотрите этот предыдущий пост, чтобы увидеть, подходит ли он:

Матричная артистика в PHP?

0 голосов
/ 06 апреля 2010

Насколько я понимаю, вы спросили «не зависящим от языка способом, как вы делаете создание матриц и преобразовывает их в виде входных данных списка или одномерных массивов».

Как правило, большинство языков реализуют массивы и массивы n измерений в качестве простых в использовании заменителей указателей.Вы создаете матрицу, шагая по указателям, представленным массивами, создаете новый элемент, который является результатом желаемого преобразования (умножение в качестве примера), и создаете новую n-мерную матрицу, которая является результатом этого преобразования.На некоторых языках (C, Pascal) вам приходится управлять памятью, выделенной для матрицы.Другие (Perl, Python, Awk, C ++) будут создавать и управлять памятью матрицы на лету.

Если я использую массив в Perl, например:

$i=4;
$array[$i] = 100;               # human readable form for ${$ref_to_array}[offset]. 
$ref_to_array = \@array         # ref to the array
print "${$ref_to_array}[$i]\n"  # that array, element $i

В C то же самое:

#include <stdio.h>

int array[] = {1,2,3,4,100}; /* const array to avoid malloc for memory */
int *ptr;

int main(void)
{

    ptr = &array[0];     /* point to the first element of the array */
    int i=4;                /* the offset of 100 */

    printf("array[%d]=%d\n", i, array[i]); /* prints 100 */
    printf("ptr+%d=%d\n", i, *(ptr+i)) ;   /* prints 100 */

    return 0;
}

Каждый язык будет отличаться в зависимости от того, как выпостроить матрицу из этих входов, хотя C и Perl похожи.

В Perl приведено умножение матрицы:

#!/usr/bin/perl
use strict;
use warnings;

sub foo  {
    my @rtr;
    my ($refa, $refb)=@_;
    for(my $i=0; $i<=$#{$refa}; $i++) {
        for(my $j=0; $j<=$#{$refb}; $j++) {
            $rtr[$i][$j]=$refa->[$i] * $refb->[$j];
            }
        }
    return \@rtr;   
    }

my @onea = (1, 2, 3);
my @oneb = (4, 5, 6);

my $rtr_ref=foo(\@onea,\@oneb);

for(my $i=0; $i<=$#{$rtr_ref}; $i++) {
    for(my $j=0; $j<=$#{@{$rtr_ref}[$i]}; $j++) {
        print "$rtr_ref->[$i][$j] ";
        }
    print "\n";
}

Вывод:

4 5 6 
8 10 12 
12 15 18 

В C алгоритм почти такой же, но все ссылки на указателии разыменования разные.

В заключение - существуют проблемы, делающие это «независимым от языка способом». Ссылка и разыменование указателя отличаются.Управление памятью другое.

Так что выбирайте свой язык, затем сосредоточьтесь на матрице.Для Perl посмотрите на PDL , для C посмотрите на GSL

0 голосов
/ 06 апреля 2010

Может быть объединить или состав ?

Кстати, если он существует, он связан с векторами (вычислением произведения матрицы), а не с массивами. Это более общая операция, которая работает с двумя матрицами (также векторы являются матрицами), если ширина первого равен высоте второго, но при этом вы считаете, что один из ваших массивов перенесен на вектор столбца.

...