Вопрос

Это то, что у меня есть до сих пор, но я не думаю, что это правильно.

for (int i = 0 ; i < 5; i++)
{
    for (int j = 0;  j < 5; j++)
    {
        matrix[i][j] += matrix[i][j] * matrix[i][j];
    }
}
Это было полезно?

Решение

Я не думаю, что вы можете умножить матрицу саму по себе на месте.

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];
        }
    }
}

Даже если вы используете менее наивное матричное умножение (т.е.что-то другое, чем это O(n3) алгоритм), вам все еще нужно дополнительное хранилище.

Другие советы

Предложение:если это не домашнее задание, не пишите свои собственные процедуры линейной алгебры, используйте любую из множества рецензируемых библиотек, которые существуют.

Теперь, что касается вашего кода, если вы хотите создать посрочный продукт, то вы делаете это неправильно, то, что вы делаете, это присваиваете каждому значению его квадрат плюс исходное значение (n*n+n или (1+n)*n, все, что вам больше нравится)

Но если вы хотите выполнить аутентичное матричное умножение в алгебраическом смысле, помните, что вам нужно было выполнить скалярное произведение первых строк матрицы на столбцы второй матрицы (или другим способом, я сейчас не очень уверен)...что - то вроде:

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

и скалярное произведение "·"

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

Конечно, с помощью этого метода вы не можете создать продукт на месте, потому что вам понадобятся значения, которые вы перезапишете на следующих шагах.

Кроме того, объясняя немного подробнее комментарий Тайлера Макгенри, как последовательность необходимости умножения строк на столбцы, "внутренние размеры" (Я не уверен, что это правильная терминология) матрицы должны совпадать (если A является m x n, B является n x o и A*C является m x o), так что в вашем случае матрицу можно возвести в квадрат, только если она квадратная (хе-хе-хе).

И если вы просто хотите немного поиграть с матрицами, то вы можете попробовать Octave, например;возведение матрицы в квадрат так же просто, как M*M или M**2.

Это не какое-либо определение умножения матриц, которое я когда-либо видел.Стандартное определение таково

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)

предоставить алгоритм в виде своего рода псевдокода.В этом случае a - это матрица m x s, а b - s x n, результатом является m x n, а нижние индексы начинаются с 1..

Обратите внимание, что умножение матрицы на место приведет к получению неправильного ответа, поскольку вы собираетесь перезаписывать значения перед их использованием.

Прошло слишком много времени с тех пор, как я занимался матричным вычислением (и я занимался им лишь самую малость, сверху), но += оператор принимает значение matrix[i][j] и добавляет к этому ценность matrix[i][j] * matrix[i][j], что, я не думаю, это то, что вы хотите сделать.

Ну, похоже, что он приводит строку / столбец в квадрат, а затем добавляет его к строке / столбцу.Это то, что ты хочешь, чтобы он сделал?Если нет, то измените его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top