【问题标题】:How to multiply each element of N vectors to each other N^N times如何将 N 个向量的每个元素相乘 N^N 次
【发布时间】:2015-07-08 11:47:48
【问题描述】:

问题是我必须将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。那么我怎样才能将它们相乘呢?这个操作有什么数学名称吗?

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

【问题讨论】:

  • 感谢@Uchiha 编辑并正确格式化。
  • 你对 3 个向量有什么样的结果?你能举个例子吗(每个向量只有 2 个数字以保持简短)?另外,你能保证所有向量都具有相同的维度(其中的数字)吗?
  • 向量将包含整数或小数。不,我不能保证所有向量都具有相同的维度。 :(

标签: php algorithm matrix vector


【解决方案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
)

【讨论】:

  • 感谢语法。但我的问题是数组的数量不固定。它可以是两个或更多。如果有更多数组,我会添加更多循环。所以代码改变了。我想要一个可以计算乘法的固定函数
  • 你的意思是这样的吗? $A = [ 1, 2, 3 ]; $B = [ 7, 8, 9, 10 ]; $C = [ 1, 2, 8 ]; ........ $Z = [ 1, 5, 8 ];
  • 如果$Z出现在图片中,会是这样吗? M1={X1*Y1*Z1},
  • 那么就像下面code M1={X1*Y1*Z1}, M2={X1*Y1*Z2}, M3={X1*Y1*Z3}, M4={ X1*Y2*Z1}, M5={X1*Y2*Z2}, M6={X1*Y2*Z3}, M7={X1*Y3*Z1}, M8={X1*Y3*Z2}, M8={ X1*Y3*Z3},M10={X2*Y1*Z1},M11={X2*Y1*Z2},M12={X2*Y1*Z3},
  • 好的,知道了。让我来做,一会儿就来。
【解决方案2】:

您可以使用递归来遍历向量元素的所有可能组合,当您需要生成一些组合对象时,这是一种标准方法。类似这样的东西(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);

【讨论】:

  • 谢谢。我正在努力理解。
【解决方案3】:

如果您在 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>";

谢谢

【讨论】:

  • 这会起作用,但数组的数量是预先确定的。你想要一些可以接受随机数量的参数的东西。 func_num_args 和一些递归的组合应该可以解决问题。
  • 你能解释一下我如何使用递归吗?
  • 如果您有两个 php 术语中的向量或数组,那么 foreach 将遍历该向量或数组中的所有值。我们不需要担心该向量中元素或值的数量
  • @Andrew 我认为我对答案的新编辑将解决单维数组乘法问题,如果您不知道要相乘的向量或数组的数量
  • @ViswanathPolaki 好答案。就我而言 +1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 2011-07-11
  • 1970-01-01
  • 2022-07-20
相关资源
最近更新 更多