Définir une matrice en évitant l'utilisation de boucles for

Nov 27 2020

J'ai une matrice 3D X de taille a x b x c.

Je souhaite créer une matrice 3D Y dans MATLAB comme suit:

X = rand(10, 10, 5);
[a, b, c] = size(X);

for i = 1 : c
    for j = 1 : a
        for k = 1 : b

            if j<a && k<b
            Y(j, k, i) = X(j+1, k, i) + X(j, k+1, i).^4;
        
            else
            Y(j, k, i) = X(a, b, i) + X(a, b, i).^4;
            end

         end
    end
end

Comment puis-je faire cela en évitant d'utiliser beaucoup de boucles for? En d'autres termes, comment puis-je réécrire le code ci-dessus plus rapidement sans utiliser beaucoup de boucles?

Réponses

2 MichaelTr7 Nov 28 2020 at 06:59

Indexation des tableaux / matrices

Ci-dessous, j'ai ajouté une partie à votre script qui crée un tableau Zidentique au tableau Yen utilisant l'indexation qui couvre les indices équivalents et les opérations par élément qui sont indiquées par le point .précédant l'opération. Des opérations telles que la multiplication *et la division /peuvent être spécifiées élément par élément comme .*et ./respectivement. L'addition et la soustraction agissent de manière élémentaire et n'ont pas besoin du point .. J'ai également ajouté une instruction if pour vérifier que les tableaux sont les mêmes et que les boucles for et les méthodes d'indexation donnent des résultats équivalents. L'indexation en utilisant endfait référence au dernier index de la dimension correspondante / respective.

Fragment:

Y = zeros(a,b,c);
Y(1:end-1,1:end-1,:) = X(2:end,1:end-1,:) + X(1: end-1, 2:end,:).^4;
Y(end,1:end,:) = repmat(X(a,b,:) + X(a,b,:).^4,1,b,1);
Y(1:end,end,:) = repmat(X(a,b,:) + X(a,b,:).^4,a,1,1);

Script complet: y compris les deux méthodes et la vérification

X = rand(10, 10, 5);
[a, b, c] = size(X);

%Initialed for alternative result%
Z = zeros(a,b,c);

%Looping method%
for i = 1 : c
    for j = 1 : a
        for k = 1 : b
            if j < a && k < b
            Y(j, k, i) = X(j+1, k, i) + X(j, k+1, i).^4;
            
            else
            Y(j, k, i) =  X(a, b, i) + X(a, b, i).^4;
            end
         end
    end
end

%Indexing and element-wise method%
Z(1:end-1,1:end-1,:) = X(2:end,1:end-1,:) + X(1: end-1, 2:end,:).^4;
Z(end,1:end,:) = repmat(X(a,b,:) + X(a,b,:).^4,1,b,1);
Z(1:end,end,:) = repmat(X(a,b,:) + X(a,b,:).^4,a,1,1);

%Checking if results match%
if(Z == Y)
   fprintf("Matched result\n"); 
end

Ran avec MATLAB R2019b