Search code examples
matlabmatrixwolfram-mathematicamatrix-multiplication

Filling MATLAB array using formula and arrays of values


I want to fill a 10x15 matrix in MATLAB using the formula z(i, j) = 2 * x(i) + 3 * y(j)^2, so that each entry at (i, j) = z(i, j). I have arrays for x and y, which are of size 10 and 15, respectively.

I've accomplished the task using the code below, but I want to do it in one line, since I'm told it's possible. Any thoughts?

x = linspace(0,1,10);
y = linspace(-0.5,0.5,15);
z = zeros(10,15);
m_1 = 2;
m_2 = 3;
for i = 1:length(x)
    for j = 1:length(y)
        z(i, j) = m_1*x(i) + m_2*y(i)^2;
    end
end

Solution

  • It looks like you have a bug in your original loop:
    You are using i index twice: m_1*x(i) + m_2*y(i)^2.

    The result is that all the columns of z matrix are the same.

    For applying the formula z(i, j) = 2*x(i) + 3*y(j)^2 use the following loop:

    x = linspace(0,1,10);
    y = linspace(-0.5,0.5,15);
    z = zeros(10,15);
    m_1 = 2;
    m_2 = 3;
    for i = 1:length(x)
        for j = 1:length(y)
            z(i, j) = m_1*x(i) + m_2*y(j)^2;
        end
    end
    

    For implementing the above loop using one line, we may use meshgrid first.

    Replace the loop with:

    [Y, X] = meshgrid(y, x);
    Z = m_1*X + m_2*Y.^2;
    

    For expansions, read the documentation of meshgrid, it is much better than any of the expansions I can write...


    The following command gives the same output as your original loop (but it's probably irrelevant):

    Z = repmat((m_1*x + m_2*y(1:length(x)).^2)', [1, length(y)]);
    

    Testing:

    max(max(abs(Z - z)))
    
    ans =
    
         0