How can I create a matrix with the values of the elements is a function of the indices?

10 views (last 30 days)
I am trying to create a matrix from two vectors (i.e. A = [0:2] and B = [-2:2]) where the values for each cell of the matrix is a function of the indices. I cannot see the path to get it there, any simple examples I can follow?
Thanks
  3 Comments
Image Analyst
Image Analyst on 6 Jan 2018
What is the function? Like the sum of the squares of A and B or something? Are you aware that your A and B don't have the same number of elements so you can't do a 1-to-1 correspondence between elements?
Benjamin Schuessler
Benjamin Schuessler on 6 Jan 2018
Edited: Benjamin Schuessler on 6 Jan 2018
Hi All,
Apologies for being convoluted. Let me try to explain more.
With the vectors I gave I know it won't give an nxn matrix.
This is the matrix I get:
C =
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
However, I would like to see something like
C =
0,-2 0,-1 0,0 0,1 0,2
1,-2 1,-1 1,0 1,1 1,2
2,-2 2,-1 2,0 2,1 2,2
Where the values inside each element will then become inputs to a function which output the function's result in the same size matrix shown above.
I hope this can shed more light!
Thanks!
*EDIT I should say that I used C = ndgrid(A,B) to create that matrix.

Sign in to comment.

Accepted Answer

Cedric
Cedric on 6 Jan 2018
Edited: Cedric on 6 Jan 2018
Not sure that I understand. If you wanted to create a rectangular array whose elements are a the result of some arithmetic operation between corresponding elements of A and B, you could use the fact that MATLAB expands automatically operands of such operations (from 2016b on, otherwise you have to use BSXFUN):
>> A = 0 : 2 ; B = -2 : 2 ;
>> A.' .* B
ans =
0 0 0 0 0
-2 -1 0 1 2
-4 -2 0 2 4
Note that here we first make A a 3x1 column vector by transposition. Then we apply an element-wise operation ( .* ) between this transpose and B that is 1x5, and MATLAB expands automatically A.' along B and vice versa (hence building 3x5 arrays) and performs the operation.
If you needed to apply a function that is not an arithmetic operation, you could do it using BSXFUN (performing an explicit call to a function that does an implicit expansion..):
>> result = bsxfun( @plus, A.', B )
result =
-2 -1 0 1 2
-1 0 1 2 3
0 1 2 3 4
or through an explicit expansion (using REPMAT, REPELEM, or MESHGRID):
>> [Bx, Ax] = meshgrid( B, A )
Bx =
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
Ax =
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
applying whatever function to the two arrays:
>> plus( Ax, Bx )
ans =
-2 -1 0 1 2
-1 0 1 2 3
0 1 2 3 4
  2 Comments
Benjamin Schuessler
Benjamin Schuessler on 6 Jan 2018
MY MAN! After reading through your answer, this is exactly what I need. Unfortunately I don't have the convenience of using R2016a however BSXFUN should work just fine!
Much appreciated!
Cedric
Cedric on 6 Jan 2018
Great, well the first input of BSXFUN is a function handle so you have a lot of flexibility here; you can even adapt the interface using an anonymous function.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!