如何将N个向量的每个元素相互相乘N ^ N次

时间:2015-07-08 11:47:49

标签: php algorithm matrix vector

问题是我必须将N vectors的每个元素相互相乘。 例如,如果有两个向量名X,Y。每个都有三个要素。 例如X={X1,x2,x3}Y={y1,y2,y3}。所以乘法是跟随

M1={X1*Y1},
M2={X1*Y2},
M3={X1*Y3},
M4={X2*Y1},
M5={X2*Y2},
M6={X2*Y3},
M7={X3*Y1},
M8={X3*Y2},
M9={X4*Y3}

我可以轻松地使用两个' for'循环。 但问题是矢量的数量是可变的。它可以是X,Y,ZX,YW,X,Y,Z。那么我怎样才能将它们相乘呢?这个操作有没有数学名称。

我的一个想法是将矢量视为一个矩阵。

3 个答案:

答案 0 :(得分:1)

如果你在php中实现,那么你可以使用foreach循环而不是如下所示的for循环: 如果你有两个数值未知的向量,那么使用它。

$x = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$y = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

foreach ($x as $key => $value) {
  foreach ($y as $k => $v) {
    echo $value * $v . "  ";
  }
}

注意:$ x可以包含任意数量的值,因此也可以包含$ y。

如果您不知道需要多少向量或数组,请尝试如下:

function multiply_arrays() {
  $args = func_get_args();
  $number_of_args = count($args);
  for ($i = 0; $i < ($number_of_args - 1); $i++) {
    if (is_array($multiplied_array)) {
      $multiplied_array = multiply_two_arrays($multiplied_array, $args[$i]);
    } else {
      $multiplied_array = multiply_two_arrays($args[$i], $args[$i + 1]);
    }
  }
  return $multiplied_array;
}

function multiply_two_arrays($x, $y) {
  $multi_array = array();
  foreach ($x as $key => $value) {
    foreach ($y as $k => $v) {
      $multi_array[] = $value * $v;
    }
  }
  return $multi_array;
}

$x = array(1, 2, 3);
$y = array(1, 2, 3);
$z = array(1, 2, 3);
$a = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$b = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$c = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
echo "<pre>";
print_r(multiply_arrays($x, $a, $b, $c));
echo "</pre>";

由于

答案 1 :(得分:1)

  

以下是您的问题的解决方案。语法可能是   不同或取决于您正在使用的编程语言。   它最初将存储第一个元素,然后执行即将到来的数组的乘法。所以数组的每个元素都是一个接一个地相乘。

<?php
function multiplyVector($a=array(),$b)
{
    $count_a = count($a);
    $count_b = count($b);

    if($count_a)
    {
        for($i=0;$i<$count_a;$i++)
        {
            for($j=0;$j<$count_b;$j++)
            {
                $result[] = $a[$i] * $b[$j];
            }
        }
    }
    else
    {
        $result = $b;
    }

    return $result;
}

$X = [ 1, 2, 3 ];

$Y = [ 7, 8, 9, 10 ];

$Z = [ 10, 20, 50];
// add multiple array to $main
$main = [ $X, $Y, $Z ];

$result = array();

foreach($main as $m)
{
    $result = multiplyVector($result,$m);
}


echo "<pre>";print_r($result);die;

结果就在这里。

Array
(
    [0] => 70
    [1] => 140
    [2] => 350
    [3] => 80
    [4] => 160
    [5] => 400
    [6] => 90
    [7] => 180
    [8] => 450
    [9] => 100
    [10] => 200
    [11] => 500
    [12] => 140
    [13] => 280
    [14] => 700
    [15] => 160
    [16] => 320
    [17] => 800
    [18] => 180
    [19] => 360
    [20] => 900
    [21] => 200
    [22] => 400
    [23] => 1000
    [24] => 210
    [25] => 420
    [26] => 1050
    [27] => 240
    [28] => 480
    [29] => 1200
    [30] => 270
    [31] => 540
    [32] => 1350
    [33] => 300
    [34] => 600
    [35] => 1500
)

答案 2 :(得分:1)

您可以使用递归来迭代向量元素的所有可能组合,这是您需要生成某些组合对象时的标准方法。这样的事情(不要记得php语法,所以它只是像php一样的伪代码):

// $X is the array of vectors, that is the first vector is
//    $X[0][0], $X[0][1], $X[0][2], ...
//    the second is $X[1][0], $X[1][1], $X[1][2], ...
//    and so on
function rec($X, $i, $prod, $res)   
         // $i is the number of vector from where we currently choose
         // $prod is current product
         // $res is the list of all found products
    if ($i>length($X)) 
        append($res, $prod)
        return
    for ($j=0; $j<length($X[$i]); $j++)  // choose element $j from vector $i
         rec($X, $i+1, $prod*$X[$i][$j], $res)


... 
$res=array();
rec($X, 0, 1, $res);