Нахождение инверсии матрицы 3х3 с использованием сборки MIPS - PullRequest
0 голосов
/ 28 октября 2019

EDIT: удалена ссылка на Pastebin, так как в ней была идентифицирующая информация. @Jester решил проблему.

Я пишу программу в MIPS Assembly, чтобы найти обратную матрицу 3x3. Однако только первые два элемента полученной обратной матрицы содержат правильные значения, а остальные как-то не так.

Я использую симулятор MARS, хотя пробовал несколько онлайн. Все они дали мне одинаковый (неправильный) результат. Поэтому я считаю, что проблема заключается в моем коде, но он выглядит логически правильным.

Вот «проблемные области». $ s0 хранит исходную матрицу, $ f0 хранит определитель, $ s1 должен хранить обратную матрицу. И $ s0, и $ s1 были распределены с использованием системных вызовов. Остальной код, доступный здесь (pastebin): (УДАЛЕНО)

#A(3,1)->(1,3)
lwc1 $f1, 4($s0)
lwc1 $f2, 20($s0)
mul.s $f1, $f1, $f2
lwc1 $f2, 8($s0)
lwc1 $f3, 16($s0)
mul.s $f2, $f2, $f3
sub.s $f1, $f1, $f2 #(1,3)
div.s $f1, $f1, $f0 #Divide by determinant
swc1 $f1, 8($s1) #Store (1,3)

#...Up until:

#A(3,3)->(3,3)
lwc1 $f1, 0($s0)
lwc1 $f2, 16($s0)
mul.s $f1, $f1, $f2
lwc1 $f2, 4($s0)
lwc1 $f3, 12($s0)
mul.s $f2, $f2, $f3
sub.s $f1, $f1, $f2 #(3,3)
div.s $f1, $f1, $f0 #Divide by determinant
swc1 $f1, 32($s1) #Store (3,3)

Например, для матрицы:

3.0 6.0 2.0

4.0 7.0 2.0

5.0 6.0 3.0

Ожидаемое обратное значение:

-1.28571 0.857143 0.285714

0.285714 0.142857 -0.285714

1.57143 -1.71429 0.428571

Однако мой код дает следующий результат:

-1.2857143 0.85714287 -1.4693878

0.4985423 -1.1432736 -0.26239064

-0.14894302 -0.9172964 -1.4693878
...