matrix indexcing in compare with two matrices

Hello
I have 3 matrices:
m_z=[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0]
m_y=[19 6 21 16 5 17 3 25 9 20 8 24 15 11 12 4 23 7 14 13 18 2 1 10 22]
m_x=[9 13 14 17 1 2 3 8 21 6 11 12]
I want to run
A=m_z(m_y)
except about the numbers that are in m_x. about these numbers, elemnts of matrix A must be zero.
Thank you very much

 Réponse acceptée

Guillaume
Guillaume le 17 Jan 2015
Wouldn't this do what you want:
m_z(m_x) = 0; %set elements m_x of m_z to 0 so when they're indexed by m_y they return 0
A = m_z(m_y);

5 commentaires

No, in fact matrix m_x is come from the index of cells that are located by 1 in matrices a, b, c (in my following code)
from my code you can find that number of elements 1 in matrix a , b and c are 4, 3 and 5 respectively.
I want to create matrix d randomly with 6 elements 1 in cells that have not been filled by one before with matrix a and b and c.
I think at the end of my code if I eliminate the number of cells that are located with 1 in matrix a and b and c from m_y I can create matrix d.
if true
function[d]=random(d_area)
a=[0 0 0 0 0;0 0 0 1 0;0 0 1 0 0;0 1 1 0 0;0 0 0 0 0]
b=[1 0 0 0 1;1 0 0 0 0;1 1 0 0 0;0 0 0 0 0;0 0 0 0 0]
c=[0 1 1 0 0;0 0 1 0 0;0 0 0 0 0;0 0 0 0 0;0 0 0 0 0]
[m n]=size(a)
aa1=numel(find (a>0))
bb1=numel(find (b>0))
cc1=numel(find (c>0))
d_area=6 %number of elements that must be 1 in matrix d
A1=aa1+bb1+cc1+d_area
aa2=numel(find(find((a>0))>A1))
bb2=numel(find(find((b>0))>A1))
cc2=numel(find(find((c>0))>A1))
B=aa2+bb2+cc2
A=A1-B
dimen=m*n;
m_y=randperm(dimen);
z1=[ones(1,A), zeros(1,dimen-A)];
z=reshape(z1,m,n)
d1=a+b+c+z
d end
Guillaume
Guillaume le 17 Jan 2015
Modifié(e) : Guillaume le 17 Jan 2015
Ah, ok. You should given that explanation from the beginning. The simplest way to do this:
a = [0 0 0 0 0;0 0 0 1 0;0 0 1 0 0;0 1 1 0 0;0 0 0 0 0]
b = [1 0 0 0 1;1 0 0 0 0;1 1 0 0 0;0 0 0 0 0;0 0 0 0 0]
c = [0 1 1 0 0;0 0 1 0 0;0 0 0 0 0;0 0 0 0 0;0 0 0 0 0]
validindices = setdiff(1:numel(a), [find(a); find(b); find(c)]);
pick = randperm(numel(validindices), 6); %6 indices to pick
d = zeros(size(a));
d(validindices(pick)) = 1
Basically, use setdiff to get the indices you can pick from (set difference of all indices minus the ones already used in a, b and c) and pick 6 from there.
fatema saba
fatema saba le 17 Jan 2015
Thank you but when I use
pick=randperm(numel(validindices),6)
I got this error
??? Error using ==> randperm
Too many input arguments.
You must have a fairly old version of matlab, then. The two argument version of randperm has been available since R2011b. Just use randperm with 1 argument and use the first 6 elements.
pick = randperm(numel(validindices);
pick = pick(1:6);
fatema saba
fatema saba le 17 Jan 2015
Thank you for your kindness

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

Community Treasure Hunt

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

Start Hunting!

Translated by