Asked by Hadi Ghahremannezhad
on 8 Oct 2019

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?

Answer by Bruno Luong
on 10 Oct 2019

Accepted Answer

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.

Hadi Ghahremannezhad
on 10 Oct 2019

Great answer.

Sign in to comment.

Answer by 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

Hadi Ghahremannezhad
on 9 Oct 2019

I know it is an internal loop, but this is what I was looking for and it is working well. Thank you.

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.

Answer by 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.

Hadi Ghahremannezhad
on 9 Oct 2019

Thahk you for the helpful answer. But I have to avoid loops here.

Steven Lord
on 9 Oct 2019

Hadi Ghahremannezhad
on 9 Oct 2019

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 7 Comments

## Rik (view profile)

## Direct link to this comment

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

## John D'Errico (view profile)

## Direct link to this comment

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

## Walter Roberson (view profile)

## Direct link to this comment

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

## Hadi Ghahremannezhad (view profile)

## Direct link to this comment

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

## James Tursa (view profile)

## Direct link to this comment

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

## Hadi Ghahremannezhad (view profile)

## Direct link to this comment

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

## Rik (view profile)

## Direct link to this comment

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

Sign in to comment.