How to add more than two elements of a cell, where each element in the cell is a matrix of identicle size?

Asked by Amit Kumar

Amit Kumar (view profile)

on 26 Feb 2019
Latest activity Commented on by Amit Kumar

Amit Kumar (view profile)

on 4 Mar 2019
Accepted Answer by Shane L

Shane L (view profile)

Hi,
A cell contains N elements, where each element is a square matrix, M1, M2, ...., MN of identicle size (say2x2). To add all matrices i.e., M1+M2+...+MN, I tried to use
"plus(M{1,:})", but works well only when the cell contains only two matrices; else it showed following error
Error using +
Too many input arguments.
The sample Matlab code to add 4 matrices of size 2x2 is show below:
M1 = [1 2; 3 4]
M2 = [2 1; 4 3]
M3 = [2 3; 5 2]
M4 = [1 3; 3 5]
M = cell(1,4);
M{1,1} = M1
M{1,2} = M2
M{1,3} = M3
M{1,4} = M4
S = plus(M{1,:})
The error upon the execution is as follows:
Error using +
Too many input arguments.
Error in celle_add_eg (line 13)
S = plus(M{1,:})
Can anyone kindly suggest the possible solution to this error?

Tags

Answer by Shane L

Shane L (view profile)

on 26 Feb 2019

Try this:
sum(cat(3, M{:}), 3)
This first concatenates all of the arrays in the cells of M into a three-dimensional numeric array, and then it sums the numeric array along the third dimension.

Amit Kumar

Amit Kumar (view profile)

on 26 Feb 2019
Thanks for the reply, but it works only for scalar inputs in the matrix.
If I am trying to use this for symbolic variables, I am getting errror "Input arguments must be two-dimensional."
i tried the following as an example:
syms s
M1 = [s+1 2; 3 4]
M2 = [2 1; 4 3]
M3 = [2 3; 5 2]
M4 = [1 3; 3 5]
M = cell(1,3);
M{1,1} = M1
M{1,2} = M2
M{1,3} = M3
M{1,4} = M4
sum(cat(3, M{:}), 3)
On the execution, I am getting the following error:
Error using symengine
Input arguments must be two-dimensional.
Error in sym/privUnaryOp (line 943)
Error in sym/sum (line 54)
s = privUnaryOp(A, 'symobj::prodsumdim', num2str(dim), '_plus');
Error in celle_add_eg (line 16)
sum(cat(3, M{:}), 3)
Kindly, suggest the possible way out for this error.
Thanks.
Shane L

Shane L (view profile)

on 26 Feb 2019
Unfortunately, I don't have access to the symbolic toolbox, so I was unable to test this solution for symbolic variables. However, I think you have two options:
1. The simplest option is likely to write a for-loop over the number of cells in M and add each matrix within the loop. This would be the most clear to a reader of the code, too. However, this may take some time if M is very large.
2. If you want to be able to take the sum in one line, here is a way to do it with only 2-D matrices:
reshape(sum(reshape(cat(2,M{:}),[],length(M)),2),size(M{1}))
This concatenates the matrices together in the second dimension, reshapes them in a 2-D array that can be summed over the second dimension, and then reshapes the result back to your original array size. Caveat: I have not been able to test this for symbolic variables. Does this work for you?
Amit Kumar

Amit Kumar (view profile)

on 4 Mar 2019
Thanks a lot !! It worked.