如何计算无循环矩阵的行列式?

时间:2019-10-08 22:39:31

标签: matlab loops matrix

我是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 :(得分:0)

根据@Andras的建议,我根据wiki page尝试了行列式:

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));