I'm pretty new to this. What I am wondering is how to test a few different matrices within a larger one.
this would be an example of what I want to do:
A = 9 7 6 5 4 A = [9 7 6 5 4;6 7 5 4 2;7 7 5 5 5;7 6 4 4 3]
6 7 5 4 2
7 7 5 5 5
7 6 4 4 3
B = 7 7 B = [7 7;7]
7
C = 7 C = [7;7;7]
7
7
D = 5 5 5 D = [5 5 5]
and then show me where in the original one they are, replacing the non-matches with 0's.
Cheers.
Any direction as to what functions I need to look into would be greatly appreciated

 Réponse acceptée

Andrei Bobrov
Andrei Bobrov le 22 Sep 2016
Modifié(e) : Andrei Bobrov le 22 Sep 2016
Bad variant
A = [9 7 6 5 4;6 7 5 4 2;7 7 5 5 5;7 6 4 4 3]
B = [7 7;7 0];
p = abs(filter2(B,A) - norm(B(:))^2) < eps(1e4);
out1 = imdilate(p,B>0).*A;
C = [7;7;7];
p2 = abs(filter2(C,A) - norm(C(:))^2) < eps(1e4);
out2 = imdilate(p2,C>0).*A;
D = [5 5 5];
p3 = abs(filter2(D,A) - norm(D(:))^2) < eps(1e4);
out2 = imdilate(p3,D>0).*A;
other variant:
use m-file findarray.m:
function [idx,arrfnd] = findarray(A,B)
[m,n] = size(A);
Ai = reshape(1:n*m,[m,n]);
[mb,nb] = size(B);
B = B(:);
t = ~isnan(B);
pb = bsxfun(@plus,(0:mb-1)',(0:nb-1)*m);
pb = pb(t);
Av = reshape(Ai(1:m-mb+1,1:n-nb+1),1,[]);
i0 = bsxfun(@plus,Av,pb(:));
ii = all(bsxfun(@eq,A(i0),B(t)));
idx = i0(:,ii);
arrfnd = zeros(m,n);
arrfnd(idx) = A(idx);
end
example of use
>> A
A =
9 7 6 5 4
6 7 5 4 2
7 7 5 5 5
7 6 4 4 3
>> B1
B1 =
7 7
7 NaN
>> [idx,arrfnd] = findarray(A,B1)
idx =
3
4
7
arrfnd =
0 0 0 0 0
0 0 0 0 0
7 7 0 0 0
7 0 0 0 0
>> C
C =
7
7
7
>> [idx,arrfnd] = findarray(A,C)
idx =
5
6
7
arrfnd =
0 7 0 0 0
0 7 0 0 0
0 7 0 0 0
0 0 0 0 0
>> D
D =
5 5 5
>> [idx,arrfnd] = findarray(A,D)
idx =
11
15
19
arrfnd =
0 0 0 0 0
0 0 0 0 0
0 0 5 5 5
0 0 0 0 0
>>|

8 commentaires

byron goodship
byron goodship le 22 Sep 2016
This worked great thanks, I changed the matrix A to incorporate some more of the patterns and it showed them as well. I am new to this software and am wondering if you could explain how you got to this code, if you have time? I am curious as to how you put it together. I have been pulling it apart to find out how it works, but still a bit puzzled. Cheers, Byron.
Andrei Bobrov
Andrei Bobrov le 22 Sep 2016
Hi! Byron! What part of the code is not clear?
byron goodship
byron goodship le 22 Sep 2016
Modifié(e) : Andrei Bobrov le 23 Sep 2016
p = abs(filter2(B,A) - norm(B(:))^2) < eps(1e4);
out1 = imdilate(p,B>0).*A;
As previously stated, I am fairly new, I've followed through some an introduction course on Coursera.org but I'm still left without a great knowledge. Just wondering if you could break it down, again if you've got the time. Cheers.
Stephen23
Stephen23 le 22 Sep 2016
Modifié(e) : Stephen23 le 22 Sep 2016
The single quote is the complex conjugate transpose operator:
The function bsxfun is used here to add the row (0:nb-1)*m to the column (0:mb-1)', creating a matrix. You can try it on some simple example to see what it is doing:
>> bsxfun(@plus,(0:3)',0:5)
ans =
0 1 2 3 4 5
1 2 3 4 5 6
2 3 4 5 6 7
3 4 5 6 7 8
Satuk Bugrahan
Satuk Bugrahan le 22 Sep 2016
Modifié(e) : Satuk Bugrahan le 22 Sep 2016
Thank you for this clear answer, though I just deleted my message because understand the deal myself howewer I am still a little bit confused about how did we add two matrix with different sizes together with 'bsxfun' . When I look at the input matrices still I cant estimate the output . At any case , thank you for the answer ...
Andrei Bobrov
Andrei Bobrov le 23 Sep 2016
Hi Byron! Coursera.org is very good but I would started with MATLAB Documentation.
Please first read about functions used in these expressions:
imdilate from the Image Processing Toolbox.
Arne T
Arne T le 15 Déc 2020
Hi Andrei!
Your code works perfectly, but I want to use it in a 3D Matrix. Unfortunately your Code only works in 2D cause bsxfun respectivly the plus operator only works in 2D with this result. Do you know a way to expand this function that it would work in 3D.
Cause Im writing a recursiv function with up to 300Mio iteratons the runtime is very important.
Thanks!
Arne T
Arne T le 16 Déc 2020
Modifié(e) : Arne T le 16 Déc 2020
I solved the problem with the following code. This works in 3D Matrix.
[m,n,o] = size(A);
Ai = reshape(1:n*m*o,[m,n,o]);
[mb,nb,ob] = size(B);
B = B(:);
t = ~isnan(B);
pb = (0:mb-1)'+(0:nb-1)*m+reshape([0:ob-1],1,1,ob)*n*m;
pb = pb(t);
Av = reshape(Ai(1:m-mb+1,1:n-nb+1,1:o-ob+1),1,[]);
i0 = Av+pb(:);
ii = all(bsxfun(@eq,A(i0),B(t)));
idx = i0(:,ii);

Connectez-vous pour commenter.

Plus de réponses (2)

KSSV
KSSV le 22 Sep 2016
Note that B = [7 7;7] is not a matrix.
You can find your required numbers from matrix A using find or ==.
Eg:
idx = A==7 ;
A(idx)
idx = find(A==5)
A(idx)

Produits

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by