Definición de una matriz evitando el uso de bucles for

Nov 27 2020

Tengo una matriz 3D X de tamaño a x b x c.

Quiero crear una matriz 3D Y en MATLAB de la siguiente manera:

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

¿Cómo puedo hacer eso evitando usar muchos bucles for? En otras palabras, ¿cómo puedo reescribir el código anterior de una manera más rápida sin usar muchos bucles?

Respuestas

2 MichaelTr7 Nov 28 2020 at 06:59

Matrices / Matrices de indexación

A continuación, agregué una parte a su secuencia de comandos que crea una matriz Zque es idéntica a la matriz Ymediante el uso de indexación que cubre los índices equivalentes y las operaciones de elementos que se indican con el punto que .precede a la operación. Las operaciones como la multiplicación *y la división /se pueden especificar por elementos como .*y ./respectivamente. La suma y la resta actúan en forma de elementos y no necesitan el punto .. También agregué una declaración if para verificar que las matrices son las mismas y que los bucles for y los métodos de indexación dan resultados equivalentes. El uso de indexación se endrefiere al último índice en la dimensión correspondiente / respectiva.

Retazo:

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);

Guión completo: incluye ambos métodos y verificación

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

Corrió usando MATLAB R2019b