据我了解,你问'以独立于语言的方式,你如何在给定列表或一维数组作为输入的情况下进行矩阵创建和转换'。
通常,大多数语言将数组和 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