基于3个输入创建矩阵

时间:2013-05-04 19:21:39

标签: python function matrix

我需要创建一个2 n矩阵

    x   y
1  x1  y1
2  x2  y2
3  x3  y3
4  x4  y4
5  x5  y5
.  ..  ..
n  xn  yn

需要从包含3个输入的函数创建:xyn,我们称之为make_m(x,y,n)

矩阵需要遵循以下标准:

  1. 列x = x
  2. 中的数字总和
  3. 列y = y
  4. 中的数字总和
  5. 在任何给定的行中,x#/ y#= x/y
  6. 必须有n行数
  7. 现在我有一个函数可以找到所有可能的xy对,并将它们返回到元组列表中,但我不知道如何处理查找哪些元组的问题将行作为行来满足4个要求。这是函数:

    def find_r(x,y):
       return [(a, a*num2/num1) for a in range(1, num1) if (a*num2) % num1 == 0]
    

    是的,会有一些例子由于比例而无法工作,例如:

    In [60]: find_r(100,891)
    Out[60]: []
    

    并且会有一些只是根本不适用于n的某些数字。例如,n高于4

    的值不可能使用以下内容
    In [57]: find_r(100,364)
    Out[57]: [(25, 91), (50, 182), (75, 273)]
    

    但现在不要担心这些。

    真正的问题是许多结果可能性有很多可能性,因此我不仅需要一个算法函数来挑选正确的元组,而是最好的元组。

    如果可能的话,我希望它选择的元组在大小上彼此接近,这意味着最好的解决方案是整个序列只重复一个元组。

    那么如何编写一个能够创建我需要的矩阵的函数呢?

1 个答案:

答案 0 :(得分:2)

有什么可以帮助您找到xy的{​​{3}}。它会告诉您仍然产生结果的最大n是什么,并且还可以帮助您找到矩阵的行。

如果您将xy除以GCD,您将获得满足比率要求的x#y#的最低组合。让我们用它来表示为z。现在你需要从1到GCD找到n个数字,其总和等于GCD。这些数字表示用作矩阵行的z的倍数。

示例: 我会将您的列表用于x = 100y = 364

In [57]: find_r(100,364)
Out[57]: [(25, 91), (50, 182), (75, 273)]

n = 2。

GCD(100,364)= 4.所以在这种情况下,z =(25,91)。 n = 2时,我们需要两个1到4之间的数字,加起来为4.这给我们两个组合:2,2 (使用这些乘以z我们得到两对数字:[(50,182),(50,182)])或1,3 ([(25,91),(75,273)])

对于n = 3,唯一的解决方案是1,1,2;并且n = 4只有1,1,1,1。任何更高的n都不会产生任何结果。

我希望这会有所帮助。此外,它期望你只能使用正整数 - 任务将变得微不足道,负面的。