Python矩阵乘法

时间:2012-08-31 17:49:18

标签: java python matrix

我无法绕过这个python脚本。任何python大师都喜欢翻译几行吗?我主要是谈论最后两个。这两行似乎有很多东西。我的主要动机是将此算法转换为Java。

u=matrix( [[1,2,2], [-2,-1,-2], [2,2,3]] )
a=matrix( [[1,2,2], [2,1,2], [2,2,3]] )
d=matrix( [[-1,-2,-2], [2,1,2], [2,2,3]] )
m=[ array([3,4,5]) ]
while m:
  for i in m:
    yield i
  g=( (i*j).getA1() for i in m for j in (u,a,d) )
  m=[ i for i in g if max is None or sum(i)<=max ]

2 个答案:

答案 0 :(得分:2)

这应该更容易转换为Java:

while len(m) != 0:
      for arr in m:
          queue.put(arr) # yield arr
      newm = []
      for arr in m:
          for mat in (u,a,d):
              i = multiply_array_matrix(arr, mat).getA1()
              if max_ is None or sum(i) <= max_:
                 newm.append(i)
      m = newm

答案 1 :(得分:2)

感谢J.F. Sebastian以及对Python的更多调查(但主要是对J.F.),我能够将其转换为Java。我更改了这些名字不仅是为了保护无辜者,而且是为了让它更具自我记录性。

用队列替换yield功能是让我走上正轨的火花。由于Java无法在(u,a,d)&#34;中做到这一点。事情,我不得不把它分成三条非常相似的线。我已经为这个帖子修剪了一些东西,但是在我完成的代码中,我在这三行中调用了一个方法,包括&#34;&lt; = max&#34;检查。

它比我预期的要快得多!

ArrayList<int[]> resultList = new ArrayList<int[]>();
ArrayList<int[]> workingList = new ArrayList<int[]>();
workingList.add(new int[]{3, 4, 5}); // add the base triple

while(workingList.size() > 0)
{
    for (int[] triple: workingList)
        addTriple(resultList, triple);

    ArrayList<int[]> additions = new ArrayList<int[]>();
    for (int[] triple: workingList)
    {
        additions.add(multiply(triple, u));
        additions.add(multiply(triple, a));
        additions.add(multiply(triple, d));
    }
    workingList = additions;
}