How do I resolve these two lines separately?

So I have matrix A that is 3x5 and a matrix B with random values and same dimensions as matrix A.
I want to find the elements in matrix B where the generated random number is lower than 0.6 and then change the coresponding elements in matrix A from 0 to 1 or from 1 to 0. Is there a way to do this without going into a for loop?
B=rand(3,5)
A=[0 0 0 1 0;1 1 1 0 0;1 0 1 1 0]
A(B<0.6 & A==0)=1
A(B<0.6 & A==1)=0
When I run this code it does what it's supposed to but the last line takes the newly-formed ones and then turnes them into zeros as well (which is not what i want).

2 件のコメント

Jon
Jon 2022 年 4 月 21 日
Can you please clarify what you are trying to do. What is the role of the original values of A in this. Maybe give a small example.
Sandi Homolak
Sandi Homolak 2022 年 4 月 21 日
it is an example of mutation in a genetic algorithm where every element has 60% chance to mutate

サインインしてコメントする。

 採用された回答

Sandi Homolak
Sandi Homolak 2022 年 4 月 21 日

1 投票

Solved it.
B=rand(3,5)
A=[0 0 0 1 0;1 1 1 0 0;1 0 1 1 0]
T=find(B<0.6 & A==1)
Z=find(B<0.6 & A==0)
A(T)=0;
A(Z)=1;

その他の回答 (3 件)

Les Beckham
Les Beckham 2022 年 4 月 21 日

1 投票

Another approach
B=rand(3,5)
B = 3×5
0.2205 0.2334 0.8353 0.4513 0.3142 0.6426 0.4411 0.6683 0.8477 0.4905 0.0294 0.5650 0.2777 0.6241 0.4927
A=[0 0 0 1 0;1 1 1 0 0;1 0 1 1 0]
A = 3×5
0 0 0 1 0 1 1 1 0 0 1 0 1 1 0
idx = B > 0.6
idx = 3×5 logical array
0 0 1 0 0 1 0 1 1 0 0 0 0 1 0
A(idx) = ~A(idx)
A = 3×5
0 0 1 1 0 0 1 0 1 0 1 0 1 0 0
Jon
Jon 2022 年 4 月 21 日
編集済み: Jon 2022 年 4 月 21 日

1 投票

It looks like you may have already answered your own question, but I think this is a little cleaner approach to do the same thing
B=rand(3,5)
A=[0 0 0 1 0;1 1 1 0 0;1 0 1 1 0]
Aold = A;
A(B<0.6 & Aold==1) = 0;
A(B<0.6 & Aold==0) = 1;

1 件のコメント

Jon
Jon 2022 年 4 月 21 日
Actually you can do it in one line
A = double((B < 0.6 & ~A) | (B > 0.6 & A))
I turn the result into a double otherwise you would have a logical array rather than an array of ones and zeros. Not sure if that matters for your application

サインインしてコメントする。

Tala
Tala 2022 年 4 月 21 日
編集済み: Tala 2022 年 4 月 21 日

0 投票

try this
B=rand(3,5);
A=[0 0 0 1 0;1 1 1 0 0;1 0 1 1 0];
B1=B>0.6;
A(B1)=1;

1 件のコメント

Sandi Homolak
Sandi Homolak 2022 年 4 月 21 日
This only changes the zeros in A into ones, but not the ones in A into zeros. I need both to happen.

サインインしてコメントする。

カテゴリ

製品

リリース

R2020b

タグ

質問済み:

2022 年 4 月 21 日

コメント済み:

Jon
2022 年 4 月 21 日

Community Treasure Hunt

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

Start Hunting!

Translated by