Alternative to while loops without using loop?
5 次查看(过去 30 天)
显示 更早的评论
Hi, are there any more efficient alternatives to while loops. eg
a = zeros(3,1,3);
b = ones(3,1,3);
while isequal(a,b) == 0
a(:,:,1) = [round(rand);round(rand);round(rand)];
a(:,:,2) = [round(rand);round(rand);round(rand)];
a(:,:,3) = [round(rand);round(rand);round(rand)];
b(:,:,1) = [round(rand);round(rand);round(rand)];
b(:,:,2) = [round(rand);round(rand);round(rand)];
b(:,:,3) = [round(rand);round(rand);round(rand)];
end
I
0 个评论
回答(2 个)
the cyclist
2018-9-5
a = zeros(3,1,3);
b = ones(3,1,3);
while not(isequal(a,b))
a = round(rand(3,1,3));
b = round(rand(3,1,3));
end
4 个评论
the cyclist
2018-9-5
Separate non sequitur remark ... if you have the Statistics and Machine Learning Toolbox, you could use the binornd command instead of round(rand()) to generate zeros and ones. I'm not sure which would be more computationally efficient, but I think what you are doing would be clearer.
the cyclist
2018-9-5
编辑:the cyclist
2018-9-5
Here is a way to do this without a while loop. It uses the trick I mentioned in a comment, that there are a finite number (512) ways of filling a 3x1x3 array with zeros and ones, and therefore there are 512x511 = 261,632 ways of choosing a pair of distinct entries.
In the code, I ...
- create the full list
- pick a at random
- delete that choice from the list
- pick b at random
list = dec2bin(0:511) - '0';
a_idx = randi(512);
a = reshape(list(a_idx,:),3,1,3);
list(a_idx,:) = [];
b_idx = randi(511);
b = reshape(list(b_idx,:),3,1,3);
The very first line is itself a pretty slick trick for getting all the permutations.
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Loops and Conditional Statements 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!