问题是我必须将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,Z
或X,Y
或W,X,Y,Z
。那么我怎样才能将它们相乘呢?这个操作有没有数学名称。
我的一个想法是将矢量视为一个矩阵。
答案 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);