例程从两个1d数组和一个函数生成一个2d数组

时间:2010-04-05 22:41:36

标签: arrays language-agnostic multidimensional-array terminology nomenclature

我猜这个概念有一个词,并且至少在一些流行的语言中可用,但我的敷衍搜索毫无结果。

我想做的伪代码示例:

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 :(得分:0)

可能合并合成

顺便说一下,如果它存在,它与向量(计算矩阵的乘积)有关,而不是与数组有关..它是一个更通用的操作,它适用于两个矩阵(也是向量是矩阵)iff第一个的宽度等于第二个的高度,但是这样你可以认为你的一个数组是一个列向量的载体。

答案 1 :(得分:0)

听起来你正在寻找矩阵乘法。请参阅此前一篇文章,了解它是否合适:

Matrix artihmetic in PHP?

答案 2 :(得分:0)

据我了解,你问'用语言独立的方式,你如何根据列表或一维数组作为输入进行矩阵创建和转换'。

通常,大多数语言都将数组和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,查看GSL