【问题标题】:routine to generate a 2d array from two 1d arrays and a function从两个一维数组和一个函数生成一个二维数组的例程
【发布时间】:2011-02-04 14:43:49
【问题描述】:

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

我想做的伪代码示例:

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?

【问题讨论】:

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


    【解决方案1】:

    也许是合并组合

    顺便说一句,如果它存在,它与向量(计算矩阵的乘积)有关,而不是与数组有关。它是一个更通用的操作,适用于两个矩阵(向量也是矩阵)如果第一个的宽度等于第二个的高度,但通过这种方式,您可以将其中一个数组视为转换为列向量。

    【讨论】:

      【解决方案2】:

      据我了解,您问“以独立于语言的方式,在给定列表或一维数组作为输入的情况下,您如何进行矩阵创建和转换”。

      一般来说,大多数语言都将数组和 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

      【讨论】:

      • @drewk:我正在寻找一种方法来简化您创建的嵌套 for 循环,即类似于 perl 的 map() 函数,它将传递的块或表达式应用于每个组合输入数组的元组。我正在为这个concept寻找一个与语言无关的name,这样我就可以用谷歌搜索它是否存在,以及它在我所使用的各种语言中的名称编写代码。我可以只使用嵌套的map() 调用,但它似乎是一个易于封装的例程,所以我想知道是否有更好的方法。
      • @drewk:感谢您提供有关 PDL 的信息;听起来 perl 相当于 numpy 或 scipy。这些天我写的 C 代码不多,但如果我再次开始这样做,GSL 可能会有所帮助。我仍然不完全确定这些库是否有我正在寻找的例程;他们可能太专业了。无论如何,我只是想知道这是否是一个众所周知的功能/概念。
      • 我认为您正在寻找的是能够获取两个列表或向量、应用操作并接收矩阵的能力。这在带有嵌套 do 循环的 Fortran 和带有嵌套 for 循环的 C 中很常见。要到达您想要的位置,只需添加对在嵌套循环/映射/任何语言习语中执行操作的子例程的引用。最好的...
      • 我更愿意避免将for 循环用于非真正迭代的操作,即在所有循环的迭代都将独立执行的情况下。在 C 或 fortran 中,这是不可避免的,但其他语言也有像 map() 这样的函数可用,所以也许也可以这样做。干杯。
      猜你喜欢
      • 2021-10-29
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 2018-12-16
      • 1970-01-01
      相关资源
      最近更新 更多