【问题标题】:Loop through three arrays, apply function to elements and store the outputs in a matrix遍历三个数组,将函数应用于元素并将输出存储在矩阵中
【发布时间】:2017-09-10 06:46:02
【问题描述】:

我想遍历 3 个数组的不同元素并根据它们的值创建一个矩阵。

我的a 向量范围从 1 到 5,我的 b 向量范围从 1 到 5,我的 x 向量范围从 2 到 10,如下所示。然后对于来自ab 的特定值,使用公式y=a*x+b,我想要得到的y 向量对应于存储在y 矩阵的第一列向量中的x 值。

之后,将ab一一更改,我希望将不同y的结果存储在y矩阵的相应列中。我该如何继续实现这一目标?


这是我试过的代码:

function mathstrial
    a = [1:1:5];
    b = [1:1:5];
    x = [2:2:10];    
    for e1 = a
        for e2 = b
            for e3 = x
                y = e1*x+e2;
            end
        end
    end
    disp(y)
end

我希望结果是

y =
3   4   5   6   7  ..
5   6   7   8   9  ..
7   8   9   10  11 ..
9   10  11  12  13 ..
11  12  13  14  15 ..
...

【问题讨论】:

    标签: matlab for-loop matrix


    【解决方案1】:

    您可以在没有任何循环的情况下执行此操作 - 更“MATLAB-esque”的做事方式。

    % Your a and b, to get combinations as a 5x5 grid we use meshgrid
    [a,b] = meshgrid(1:5, 1:5);
    % We want to make a 5x5x5 3D matrix, where the 2D layers each use a different value
    % for x, and the gridded a and b we just generated. Get the layered x:
    x = repmat(reshape(2:2:10, 1, 1, []), 5, 5, 1);
    % Now we want the corresponding layered a and b
    a = repmat(a, 1, 1, 5); b = repmat(b, 1, 1, 5);
    % Now calculate the result, ensuring we use element-wise multiplication .*
    y = a.*x + b; 
    % Reshape to be a 2D array, collapsing the 3rd dimension
    y = reshape(y(:,:).', [], 5, 1);
    

    你想要的结果:

    y = 
    [3,   4,   5,   6,   7
     5,   6,   7,   8,   9
     7,   8,   9,  10,   11
     9,   10,  11,  12,  13
     ...
     41,  42,  43,  44,  45
     51,  52,  53,  54,  55]
    

    您可以通过使用size 代替 5s 来轻松地使其更通用,以获得合适的尺寸。

    【讨论】:

    • 不错!并且非常清楚您采取了哪些步骤。这就是避免循环的方法。也许值得一个不同的主题,但在我看来,matlab 总是进行计算,要么快速且内存非常重(repmat),要么缓慢(循环)且内存使用量最少。我说的对吗?
    • 这是一个相当大的概括,取决于你想要达到的目标
    【解决方案2】:

    您可以在单个 for loop 中构建 y

    a = [1:1:5];
    b = [1:1:5];
    x = [2:2:10];
    y = zeros(5,5,5);
    for ct = 1:length(a)
        y(:,:,ct) = (a(ct).*x)'+b;
    end
    

    b 在第二个维度上,a 在第三个维度上。

    甚至在一个不可读的行中

    y=repmat((a'.*x),[1,1,length(b)])+repmat(permute(b,[1,3,2]),[length(x),length(a),1])
    

    a 在第二个维度上,b 在第三个维度上

    【讨论】:

    • 您可以在没有单个 for loop 的情况下建立 y ;)
    • 是的,甚至在一行中。 :)
    【解决方案3】:
    a = [1:1:5];
    b = [1:1:5];
    x = [2:2:10];
    y = zeros(5,5,5);
    for i = 1:5
        for j = 1:5
            for k =1:5
    
                y(i,j,k) = i*x(k)+j
    
            end
        end
    end
    final_y = reshape(y, [5, 25])
    

    【讨论】:

    • 矩阵 y 将是三维的
    • 先生,我如何将不同 k 的结果并排放置在 1 个矩阵中?假设 [ y(:,:,1) y(:,:,2) y(:,:,3) y(:,:,4) y(:,:,5) ]
    • final_y = horzcat(y(:,:,1),y(:,:,2),y(:,:,3),y(:,:,4),y( :,:,5))
    • 先生,我可以让它进入一个循环......如果 k 包含 n=100 个数字
    • @hrk23 ,我改变了主要答案
    猜你喜欢
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    相关资源
    最近更新 更多