Как вычислить определитель матриц без цикла? - PullRequest
0 голосов
/ 09 октября 2019

Я новичок в Matlab, и это может показаться очень простым.

У меня есть 2 матрицы:

a = [1 1 1; 2 2 2 ; 3 3 3 ; 4 4 4 ; 5 5 5];
b = [4 4 4; 3 2 4 ; 1 5 7 ; 4 3 8 ; 2 4 7];

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

1 1 1
4 4 4
1 1 1

, а второй (d(2)) будет из этой матрицы:

2 2 2
3 2 4
1 1 1

ии так далее ...

Когда я пытаюсь это сделать:

m = size(a,1);
ons = ones(m,3);
d = det([a(:,:) ; b(:,:) ; ons(:,:)]);

Я получаю эту ошибку:

Ошибка при использовании det

Матрица должнабыть квадратным.

Как я могу вычислить все детерминанты одновременно без использования цикла?

1 Ответ

0 голосов
/ 09 октября 2019

По предложению @ Andras я попробовал определитель в соответствии с вики-страницей :

fgdg

По предложению @ beaker это работает:

d = (a(:, 1) .* b(:, 2) - a(:, 2) .* b(:, 1)) - (a(:, 1) .* b(:, 3) - a(:, 3) .* b(:, 1)) + (a(:, 2) .* b(:, 3) - a(:, 3) .* b(:, 2))

Это более медленные альтернативы:

d = arrayfun(@(x)det([a(x,:);b(x,:);ones(1,3)]),1:length(a));
d = bsxfun(@times, a(:,1), b(:,2))+ bsxfun(@times, a(:,2), b(:,3)) +...
    bsxfun(@times, a(:,3), b(:,1))- bsxfun(@times, a(:,3), b(:,2)) -...
    bsxfun(@times, a(:,2), b(:,1))- bsxfun(@times, a(:,1), b(:,3));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...