24 views (last 30 days)

I am new to Matlab and this might seem very easy.

I have 2 matrices:

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

I wanted to calculate the determinant of each row of the two matrices added by a row of ones (a 3*3 matrix), and put all the determinants in another array. For example, first determinant (d(1)) would be from this matrix:

1 1 1

4 4 4

1 1 1

and the second one (d(2)) would be from this matrix:

2 2 2

3 2 4

1 1 1

and so on...

When I try this:

m = size(a,1);

ons = ones(m,3);

d = det([a(:,:) ; b(:,:) ; ons(:,:)]);

I get this error:

Error using det

Matrix must be square.

How can I calculate all the determinants at once without using loop?

Bruno Luong
on 10 Oct 2019

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

Bruno Luong
on 10 Oct 2019

Some timing

a=rand(1e6,3);

b=rand(1e6,3);

tic

d=arrayfun(@(x)det([a(x,:);b(x,:);ones(1,3)]),(1:length(a))');

toc % 5.066323 seconds.

tic

A = reshape(a.',1,3,[]);

B = reshape(b.',1,3,[]);

ABC = [A; B];

ABC(3,:,:) = 1;

d = zeros(size(a,1),1);

for k=1:size(a,1)

d(k) = det(ABC(:,:,k));

end

toc % Elapsed time is 1.533522 seconds.

tic

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

toc % Elapsed time is 0.060121 seconds.

I keep writing since day one that ARRAYFUN is mostly useless when speed is important.

Sign in to comment.

David Hill
on 9 Oct 2019

d=arrayfun(@(x)det([a(x,:);b(x,:);ones(1,3)]),1:length(a));

Rik
on 9 Oct 2019

Bruno Luong
on 10 Oct 2019

You have accepted the worse answer in term of runing time, see the tic/toc I made below

Sign in to comment.

Steven Lord
on 9 Oct 2019

This line of code:

d = det([a(:,:) ; b(:,:) ; ons(:,:)]);

Stacks all of a on top of all of b, and stacks that on top of all of ons. It then tries to take the determinant of that array. Let's see the matrix you created.

d = [a(:,:) ; b(:,:) ; ons(:,:)]

d =

1 1 1

2 2 2

3 3 3

4 4 4

5 5 5

4 4 4

3 2 4

1 5 7

4 3 8

2 4 7

1 1 1

1 1 1

1 1 1

1 1 1

1 1 1

The easiest way to accomplish what you want is a for loop that iterates through the rows of the a and b matrices. It's hard to give an example of the technique on your data that doesn't just give you the solution (which I'd prefer not to do, since this sounds like a homework assignment.) So I'll just point to the array indexing documentation. You want to access all of one of the rows of a (and all of the same row of b) and use that accessed data to create the d matrix for that iteration of the for loop. Each iteration will have a different d.

Steven Lord
on 9 Oct 2019

Sign in to comment.

Sign in to answer this question.

Opportunities for recent engineering grads.

Apply Today
## 7 Comments

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/484288-how-to-calculate-determinant-of-matrices-without-loop#comment_754130

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/484288-how-to-calculate-determinant-of-matrices-without-loop#comment_754130

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/484288-how-to-calculate-determinant-of-matrices-without-loop#comment_754132

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/484288-how-to-calculate-determinant-of-matrices-without-loop#comment_754132

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/484288-how-to-calculate-determinant-of-matrices-without-loop#comment_754163

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/484288-how-to-calculate-determinant-of-matrices-without-loop#comment_754163

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/484288-how-to-calculate-determinant-of-matrices-without-loop#comment_754333

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/484288-how-to-calculate-determinant-of-matrices-without-loop#comment_754333

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/484288-how-to-calculate-determinant-of-matrices-without-loop#comment_754527

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/484288-how-to-calculate-determinant-of-matrices-without-loop#comment_754527

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/484288-how-to-calculate-determinant-of-matrices-without-loop#comment_754552

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/484288-how-to-calculate-determinant-of-matrices-without-loop#comment_754552

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/484288-how-to-calculate-determinant-of-matrices-without-loop#comment_754609

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/484288-how-to-calculate-determinant-of-matrices-without-loop#comment_754609

Sign in to comment.