Question

est ce que j'ai à ce jour, mais je ne pense pas que ce soit juste.

for (int i = 0 ; i < 5; i++)
{
    for (int j = 0;  j < 5; j++)
    {
        matrix[i][j] += matrix[i][j] * matrix[i][j];
    }
}
Était-ce utile?

La solution

Je ne pense pas que vous pouvez multiplier une matrice par lui-même en place.

for (i = 0; i < 5; i++) {
    for (j = 0; j < 5; j++) {
        product[i][j] = 0;
        for (k = 0; k < 5; k++) {
            product[i][j] += matrix[i][k] * matrix[k][j];
        }
    }
}

Même si vous utilisez une multiplication de matrice moins naïve (à savoir quelque chose d'autre que ce O (n 3 ) algorithme), vous avez encore besoin de stockage supplémentaire.

Autres conseils

Suggestion: si ce n'est pas un devoir de ne pas écrire vos propres routines d'algèbre linéaire, utilisez l'une des nombreuses bibliothèques examinées par des pairs qui sont là

.

Maintenant, au sujet de votre code, si vous voulez faire un produit terme à long terme, alors vous le faites mal, ce que vous faites est d'attribuer à chaque valeur, il est carré, plus la valeur d'origine (n*n+n ou (1+n)*n, quelle que soit vous aimez mieux)

Mais si vous voulez faire une multiplication matricielle authentique au sens algébrique, rappelez-vous que vous deviez faire le produit scalaire des premières lignes de la matrice par les secondes colonnes de la matrice (ou l'inverse, je ne suis pas très sûr maintenant ) ... quelque chose comme:

for i in rows:
    for j in cols:
        result(i,j)=m(i,:)·m(:,j)

et le produit scalaire "·"

v·w = sum(v(i)*w(i)) for all i in the range of the indices.

Bien sûr, avec cette méthode vous ne pouvez pas faire le produit en place, parce que vous aurez besoin des valeurs que vous écrasez dans les prochaines étapes.

En outre, ce qui explique un peu plus loin le commentaire de Tyler McHenry, comme consecuence d'avoir à multiplier les lignes par des colonnes, la « dimensions intérieures » (Je ne suis pas sûr que ce soit la terminologie correcte) de les matrices doivent correspondre (si A est m x n, B est n x o et A*C est m x o), donc dans votre cas, une matrice peut être seulement au carré si elle est carré (he he he).

Et si vous voulez juste jouer un peu avec des matrices, alors vous pouvez essayer Octave, par exemple; une matrice d'élévation au carré est aussi facile que M*M ou M**2.

Ce n'est pas une définition de la multiplication de la matrice que j'ai jamais vu. La définition standard est

for (i = 1 to m)
   for (j = 1 to n)
      result(i, j) = 0
      for (k = 1 to s)
         result(i, j) += a(i, k) * b(k, j)

pour donner l'algorithme dans une sorte de pseudo-code. Dans ce cas, a est un m x la matrice de et b est un s x n, le résultat est un m x n, et les indices commencent par 1 ..

Notez que la multiplication d'une matrice en place va obtenir la mauvaise réponse, puisque vous allez remplacerez les valeurs avant de les utiliser.

Il a été trop longtemps que je l'ai fait les mathématiques matrice (et je ne l'ai fait un peu de celui-ci, au-dessus), mais l'opérateur += prend la valeur de matrix[i][j] et y ajoute la valeur de matrix[i][j] * matrix[i][j], que je don « t pense est ce que vous voulez faire.

Eh bien, il ressemble à ce qu'il fait est la ligne d'élévation au carré / colonne, puis l'ajouter à la ligne / colonne. Est-ce ce que vous voulez faire? Sinon, changez-le.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top