Warm tip: This article is reproduced from serverfault.com, please click

matlab-通过避免使用for循环来定义矩阵

(matlab - Defining a matrix by avoiding the use of for loops)

发布于 2020-11-27 22:59:09

我有一个三维矩阵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循环来做到这一点?换句话说,如何在不使用大量循环的情况下以更快的方式重写以上代码?

Questioner
Christina
Viewed
11
MichaelTr7 2020-11-28 23:58:11

索引数组/矩阵

下面,我在你的脚本中添加了一部分,以创建一个Z与数组相同的数组,方法是Y使用索引,该索引涵盖等效的索引和逐个元素的操作,这些操作由.操作前的点表示诸如乘法*和除法的运算/可以分别.*指定./此外并在逐元素的时尚减法行为,并不需要点.我还添加了一个if语句,以检查数组是否相同以及for循环和索引方法是否得出相同的结果。使用索引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跑