Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

If I have a 3d matrix(A), how can i check if a given 2d matrix(B) is one of matrix A's pages?

Asked by may on 12 Feb 2013

I have a 3d matrix A, let say A is a 2x2x3 matrix as follows [1 2 ;3 4] [5 6;3 4] [5 6;1 2]

now I want to know if a 2x2 matrix like [5 6;3 4] is one of A's pages. so since [5 6;3 4] is the second page of A, I should get 1 as the answer.

0 Comments

may

Products

3 Answers

Answer by Jan Simon on 12 Feb 2013
Accepted answer

Another approach:

A = cat(3, [1 2; 3 4], [5 6; 3 4], [5 6; 1 2])
B = [5 6; 3 4]
S = reshape(A, 1, []);
T = reshape(B, 1, []);
match  = strfind(S, T);
Result = any(mod(match, 4) == 1);

This can be made a one-liner easily.

1 Comment

may on 12 Feb 2013

thank you a lot

Jan Simon
Answer by Teja Muppirala on 12 Feb 2013

Given a 3d matrix A:

A = cat(3, [1 2; 3 4], [5 6; 3 4], [5 6; 1 2])

And some 2d matrix B

B = [5 6; 3 4]

Then, the following expression is one way to see if B is a page in A:

any(all(all(bsxfun(@eq,A,B)))) % Returns true

Moreover, if you would like to know which page of A in which B was found, you could do this:

find(all(all(bsxfun(@eq,A,B)))) % Returns 2

0 Comments

Teja Muppirala
Answer by Jan Simon on 12 Feb 2013
Edited by Jan Simon on 12 Feb 2013

What about a simple FOR loop?

A = cat(3, [1 2; 3 4], [5 6; 3 4], [5 6; 1 2])
B = [5 6; 3 4]
Result = false;
for iA = 1:size(A, 3)
  if isequal(A(:, :, iA), B)
    Result = true;
    break;
  end
end

Here it is exploited, that a single trailing index is omitted automatically:

size(A(:, :, 1))

does not reply [2, 2, 1], but [2, 2]. Otherwise ISEQUAL would fail here.

0 Comments

Jan Simon

Contact us