我是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时出错
矩阵必须为正方形。
如何在不使用循环的情况下立即计算所有行列式?
答案 0 :(得分:0)
根据@Andras的建议,我根据wiki page尝试了行列式:
根据@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));