在Python中,将循环中的两个矩阵相乘以

在Python中,将循环中的两个矩阵相乘以,python,ipython-notebook,Python,Ipython Notebook,我正在编写以下识别人脸的代码: def clasificaImagen(numVS, numEntre, I): if numVS > 70: # No puede haber mas de 400 valores singulares numVS = 70; if numEntre > 76: # Queremos al menos 100 imagenes de prueba numEntre = 76; # Impo

我正在编写以下识别人脸的代码:

def clasificaImagen(numVS, numEntre, I):

    if numVS > 70: # No puede haber mas de 400 valores singulares
        numVS = 70;

    if numEntre > 76: # Queremos al menos 100 imagenes de prueba
        numEntre = 76;

    # Importamos las imagenes
    personajes = np.array([144,109,200,121,200,77]);
    persuma=np.array([0,144,253,453,574,774,851]);

    # Declaramos nuestras variables
    E = []; #np.mat(4096, numEntre, 6); %zeros(4096, numEntre, 6);
    U = []; #np.mat(4096, numEntre, 6); %zeros(6,1);
    Uk = []; #cell(4096, numVS, 6); %zeros(6, 1);
    aciertos = 0; 
    pruebas = sum(personajes)-(numEntre*6);  
    pguess = 0; # El digito que el programa asigna a cada imagen

    # Calculamos las matrices de entrenamiento para cada digito
    print 'Generando conjuntos de entrenamiento';

    for j in range(0,6):
        # E(j) tiene dimension 76 x numEntre
        E.append(I[:, persuma[j]+1:persuma[j]+numEntre]);
        # U(j) tiene dimension 76 x 76
        u, S, V = np.linalg.svd(E[j]);
        U.append(u);
        # Uk(j) tiene dimension 76 x numVS
        uk = U[j];
        uk = uk[:, 1:numVS];
        Uk.append(uk);

        type(Uk[1])
        print 'Clasificando imagenes';

    for i in range(0,6): 

        rMin = 9999999; 
        P = I[:, persuma[i]+1+numEntre:persuma[i+1]]; 

        for h in range(0,(personajes[i] - numEntre)-1):
            z = P[:, h]; 

            for j in range(0,6):
                ukMult = Uk[j]*Uk[j].T;
                ukMult = ukMult*z;
                ukMult = z - ukMult;
                res = np.linalg.norm(ukMult);
                if res < rMin:
                    pguess = j - 1;
                    rMin = res;

            if pguess == i-1:
                aciertos = aciertos + 1;

    print 'Calculando porcentaje de aciertos';
    return 100*aciertos/pruebas;
发生了什么事?代码上的注释是西班牙语,但我只是想看看是否有人能解释矩阵乘法的问题。如有必要,我可以用英语发表评论

我认为乘法定义得很好,因为它只是矩阵及其转置的乘积,所以不应该有任何问题

使用

  np.dot(Uk[j]*Uk[j].T)
也没用

调用numpy.dot()函数时,它需要两个参数,而不是上面所示的一个参数。试着这样做:

np.dot(Uk[j], Uk[j].T)
>>> a = [[1, 0], [0, 1]]
>>> b = [[4, 1], [2, 2]]
>>> np.dot(a, b)
array([[4, 1],
       [2, 2]])
文件如下:

他们列出的示例如下所示:

np.dot(Uk[j], Uk[j].T)
>>> a = [[1, 0], [0, 1]]
>>> b = [[4, 1], [2, 2]]
>>> np.dot(a, b)
array([[4, 1],
       [2, 2]])

还要查看numpy.matrix类:

您的代码缩进已关闭,因此很难理解。请考虑修理它,这样别人会更容易帮助你。注释移动了一切,我没有注意到。
np.dot()
不是用于矩阵乘法吗?你写的是元素乘法。
*
是元素乘法,使用
np.dot
进行矩阵乘法。是的。那也没用。也许问题在于矩阵的定义?