Это то, что у меня есть до сих пор, но я не думаю, что это правильно.
for (int i = 0 ; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
matrix[i][j] += matrix[i][j] * matrix[i][j];
}
}
Это то, что у меня есть до сих пор, но я не думаю, что это правильно.
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]
, что я не думаю это то, что вы хотите сделать.
Ну, похоже, что он возводит в квадрат строку/столбец, а затем добавляет его к строке/столбцу. Это то, что вы хотите сделать? Если нет, то меняй.