Определение матрицы, избегая использования циклов for

#matlab

#matlab

Вопрос:

У меня есть трехмерная матрица X размера a x b x c .

Я хочу создать 3D-матрицу Y в MATLAB следующим образом:

 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 amp;amp; 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? Другими словами, как я могу переписать приведенный выше код более быстрым способом, не используя много циклов?

Комментарии:

1. Вам нужна только поэлементная мощность : Y = X X.^4; (добавление уже поэлементно)

2. @LuisMendo Я отредактировал свой код!

3. Как X инициализируется? На вопросы легче отвечать, когда вы действительно можете запустить код.

4. @CrisLuengo Я полагаю, что X является случайной матрицей. Я отредактировал свой код!

Ответ №1:

Индексирование массивов / матриц

Ниже я добавил в ваш скрипт часть, которая создает массив Z , идентичный массиву Y , используя индексацию, которая охватывает эквивалентные индексы и поэлементные операции, обозначенные точкой . , предшествующей операции. Такие операции, как умножение * и деление / , могут быть заданы поэлементно как .* и ./ соответственно. Сложение и вычитание выполняются поэлементно и не требуют точки . . Я также добавил оператор if, чтобы проверить, что массивы одинаковы и что методы for-loops и indexing дают эквивалентные результаты. Индексация с использованием 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 amp;amp; 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 resultn"); 
end
 

Запускался с использованием MATLAB R2019b