Effacer les filtres
Effacer les filtres

Alternative to for loop i.e. recursion

2 vues (au cours des 30 derniers jours)
Maaz ul mosaid
Maaz ul mosaid le 3 Avr 2019
Modifié(e) : Jan le 3 Avr 2019
My code like this but what should I do to change the code so that it automatically calcultes the matrix for p=4 without using for loops. I want to convert this function into a recursive function.
function M=FakLoop3
p=3;
v=0;
indis=zeros(1,p);
M=zeros(2^p,p)
for i=0:1
indis(1)=i;
for j=0:1
indis(2)=j;
for k=0:1
indis(3)=k;
v=v+1;
M(v,:)=indis;
end
end
end
end
  4 commentaires
Maaz ul mosaid
Maaz ul mosaid le 3 Avr 2019
This is not a homework. I am trying to replace the for loops so that it can vary with p, I think recursive is the solution to this problem. Please post the solution if you can.
Jan
Jan le 3 Avr 2019
Modifié(e) : Jan le 3 Avr 2019
I've posted an efficient solution already. I repeat it in an answer. Of course you can solve this by recursion, but the shown method is much more efficient.

Connectez-vous pour commenter.

Réponses (1)

Jan
Jan le 3 Avr 2019
Modifié(e) : Jan le 3 Avr 2019
Inlined dec2bin(0:2^p-1):
M = rem(floor((0:2^p-1).' .* 2 .^ (1-p:0)), 2)
Another solution:
M = zeros(2^p, p, 'uint8');
n1 = 1;
n2 = 2^(p-1);
v = uint8([0;1]);
for k = 1:p
M(:, k) = repmat(repelem(v, n2, 1), n1, 1);
n1 = n1 * 2;
n2 = n2 / 2;
end
Or:
M = zeros(2^p, p, 'uint8');
v = uint8(0:2^p-1).';
for k = p:-1:1
M(:, k) = bitget(v, 1);
v = bitshift(v, -1);
end
With doubles instead:
M = zeros(2^p, p, 'uint8');
v = (0:2^p-1).';
for k = p:-1:1
M(:, k) = rem(v, 2);
v = floor(v / 2);
end

Catégories

En savoir plus sur Function Creation dans Help Center et File Exchange

Tags

Produits


Version

R2016a

Community Treasure Hunt

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

Start Hunting!

Translated by