3

考虑以下代码

X=np.matrix([[1,-1,1],[-1,0,1]])

print X.T
'''
[[ 1 -1]
 [-1  0]
 [ 1  1]]
'''

我想检查是否存在转置具有 <0 解决方案的解决方案。例如,这意味着检查以下是否有解决方案

1*y1 + -1*y2 < 0
-1*y1 + 0*y2 < 0
1*y1 + 1*y2 < 0

尝试阅读http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.solve.html#numpy.linalg.solve但显然没有这样的运气

4

2 回答 2

1

您的问题似乎等同于询问包含原点和向量的平面是否U=r_[1,-1,1]延伸V=r_[-1, 0, 1]到所有坐标均为负的 3-d 空间的八分圆。

叉积UxV(或者cross(U,V)是这个平面的法线。如果这个叉积有三个非零分量都具有相同的符号,那么它的法线都不能在可怕的八分圆中。对于你的数字,我得到三个分量都是负数,所以没有解决办法。

[更新]

一般来说,当法线包含零时会发生棘手的事情:

三零:您的原始向量是平行的,或者其中一个为零。选择一个不为零的,并且如果所有组件都具有相同的符号,那么您就有了解决方案。

两个零:您的飞机是 X=0、Z=0、Y=0 之一。因此,一维总是非负的,没有解。

一零:您的平面包括 X、Y 或 Z 轴。当且仅当法线的其余两个分量具有不同的符号时,才有解决方案。

于 2013-05-23T15:44:10.503 回答
0

这是您需要的文档:

numpy 沿轴应用

import numpy as np:
def func(b,y1,y2):
    a = b.T
    if a[0]*y1 + a[1]*y2 < 0:
        return True
    else:
        return False
np.apply_along_axis(func,0,X,y1,y2)

所以现在假设你想要 y1 作为 -1 和 y2 作为 3:

>>> np.apply_along_axis(func,0,X,-1,3)
array([ True, False, False], dtype=bool)

所以这意味着在转置第一行(这将是正常的第一列)与您的算法一起工作,第二和第三不!

这是一个任意数量的 Y 的函数,就像你想要的一样大的矩阵:

def func(b,*args):
    a = b.T
    total = [a[i]*args[i] for i in range(len(args)-1)]
    if sum(total) < 0:
        return True
    else:
        return False
于 2013-05-23T15:37:11.893 回答