Как умножить матрицу саму на себя?

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

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

person Bramble    schedule 22.07.2009    source источник
comment
Что ж, в этом коде нет ничего плохого, так как он будет компилироваться/запускаться без сбоев, но это не то, как умножение матриц обычно определяется в математике. Беглый поиск в Google по умножению матриц подскажет вам алгоритм для этого. Также обратите внимание, что в зависимости от размеров не всегда возможно умножить матрицу саму на себя.   -  person Tyler McHenry    schedule 23.07.2009
comment
возможный дубликат Существует ли алгоритм умножения квадратных матриц в -место?   -  person Peter O.    schedule 23.08.2014


Ответы (5)


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

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)), вам все равно потребуется дополнительное хранилище.

person ephemient    schedule 22.07.2009

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

Теперь, что касается вашего кода, если вы хотите сделать продукт по терминам, то вы делаете это неправильно, то, что вы делаете, это присваивание каждому значению, которое оно квадратное, плюс исходное значение (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.

person Community    schedule 22.07.2009

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

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..

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

person David Thornley    schedule 22.07.2009

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

person Thomas Owens    schedule 22.07.2009

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

person Community    schedule 22.07.2009