Sum two cells and write to a third cell

62 views (last 30 days)
I have three cells A{10}, B{10} and C{10} of size 5x5. On each cell I want to do: A(:,1) = B(:,1) + C(:,1) I might also want to do: A(2:4,5) = B(2:4,5) + C(2:4,5)
Currently if I just write something like above, I will get error as Index exceeds matrix dimensions.
Any ideas on how this can be done (as fast as possible)

Accepted Answer

Alfonso Nieto-Castanon
Alfonso Nieto-Castanon on 11 May 2015
Edited: Alfonso Nieto-Castanon on 11 May 2015
Probaby a loop is going to be fastest, e.g.:
for n=1:numel(A)
A{n}(:,1)=B{n}(:,1)+C{n}(:,1);
end
but if you really dislike for loops you could always do something like:
A = cellfun(@(a,b,c)[b(:,1)+c(:,1) a(:,2:end)], A, B, C, 'uni',0);
  3 Comments
User05
User05 on 12 May 2015
Sorry that in1 was typo. Initializing out to something in beginning works. Below code achieves what I want to do:
in1 = cell(1,5);
in1(:) = {int32(zeros(10,10))};
in2 = cell(1,5);
in2(:) = {int32(ones(10,10))};
out = cell(1,5);
out(:) = {int32(zeros(10,10))};
for n=1:5
out{n}(:,1)=in1{n}(:,1)+in2{n}(:,1);
end

Sign in to comment.

More Answers (1)

Walter Roberson
Walter Roberson on 11 May 2015
Edited: Walter Roberson on 12 May 2015
cellfun()
However, the method to do it "as fast as possible" is likely to involve creating some mex code written in C and optimizing the heck out of it. It would probably take you a few months to learn how to do properly -- I know the resident expert James Tursa is still learning about using mex after what must be at least 8 years of working with it.
  3 Comments
User05
User05 on 12 May 2015
I tried this anonymous function suggestion, but I dont quite get whats it exactly doing. My code:
in1 = cell(1,5);
in1(:) = {int32(zeros(10,10))};
in2 = cell(1,5);
in2(:) = {int32(ones(10,10))};
out = cell(1,5);
out(:) = {int32(zeros(10,10))};
out = cellfun(@(a, b, c) [a(:,1:end-1), b(:,1) + c(:,1)], out, in1, in2, 'Uniform', false);
After execution I see that 10th col of each cell in out is getting assigned value 1. What I wanted and expected was the 1st col should be all 1. So isnt that what is suppose to happen when I write b(:,1)+c(:,1)? Also what is a(:,1:end-1) doing?

Sign in to comment.

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by