for 루프 사용을 피하여 행렬 정의

Nov 27 2020

크기 의 3D 행렬 X 가 있습니다 a x b x c.

다음과 같이 MATLAB에서 3D 행렬 Y 를 만들고 싶습니다 .

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

for 루프를 많이 사용하지 않고 어떻게 할 수 있습니까? 즉, 루프를 많이 사용하지 않고 위 코드를 더 빠르게 다시 작성할 수있는 방법은 무엇입니까?

답변

2 MichaelTr7 Nov 28 2020 at 06:59

배열 / 행렬 인덱싱

아래에서는 작업 앞의 점으로 표시된 등가 인덱스 및 요소 별 작업을 다루는 인덱싱을 사용하여 Z배열과 동일한 배열을 만드는 스크립트에 일부를 추가했습니다 . 곱셈 및 나눗셈 과 같은 연산 은 각각 및 로 요소별로 지정할 수 있습니다 . 덧셈과 뺄셈은 요소별로 작용 하며 점이 필요 하지 않습니다 . 또한 배열이 동일하고 for 루프 및 인덱싱 메서드가 동일한 결과를 제공하는지 확인하기 위해 if 문을 추가했습니다. 다음을 사용하여 인덱싱 은 해당 / 각 차원의 마지막 인덱스 를 참조합니다.Y.*/.*./.end

단편:

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

전체 스크립트 : 두 가지 방법 및 검사 포함

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

MATLAB R2019b를 사용하여 실행