adding data from one cell array to a matrix

M is a 2x4matrix
H is a 3x4cell array
How do i add the 1st row of H to every row of M?
M = [
1 2 3 4
5 6 7 8
];
H = {[15 35] [10 20] [30 40 10] [15]
[30 20 15] [45 55] [50 70] [30 70]
[25] [10 20 30] [25 35] [60 70]};
fun = @(m,h) [fliplr(h)+m,m,m+h];
ans=cellfun(fun,num2cell(M), *H{1,:}*,'Uni',0); < what do i put H as?
ans={[36 16 1 16 36] [20 12 2 12 22] [13 43 33 3 33 43 13] [19 4 19]
[40 20 5 20 40] [26 16 6 16 26] [17 47 37 7 37 47 17] [23 8 23]}

2 Comments

Do not use ans as the names of any variable. It is a special variable that can be overwritten by MATLAB.
It is ok, its not being used in the code itself, its in here just to predict the results in theory

Sign in to comment.

 Accepted Answer

Stephen23
Stephen23 on 29 Nov 2017
Edited: Stephen23 on 29 Nov 2017
If M has two rows then
H([1,1],:)
In general
H(ones(1,size(M,1)),:)
or
repmat(H(1,:),size(M,1),1)

3 Comments

Demonstration:
M = [1,2,3,4;5,6,7,8];
H = {[15,35],[10,20],[30,40,10],[15];[30,20,15],[45,55],[50,70],[30,70];[25],[10,20,30],[25,35],[60,70]};
fun = @(m,h) [fliplr(h)+m,m,m+h];
tmp = H(ones(1,size(M,1)),:);
C = cellfun(fun,num2cell(M),tmp, 'Uni',0);
Giving:
>> C{:}
ans =
36 16 1 16 36
ans =
40 20 5 20 40
ans =
22 12 2 12 22
ans =
26 16 6 16 26
ans =
13 43 33 3 33 43 13
ans =
17 47 37 7 37 47 17
ans =
19 4 19
ans =
23 8 23
>>
wow thanks again, you predicted what i was going to ask, since my M is meant to be a much larger sized matrix
eg M= 400x1300
H= 10x1300
row=1;
while row<=10
fun = @(m,h) [fliplr(h)+m,m,m+h];
tmp = H(ones(1,size(M,1)),:); <i changed this to do it for increasing rows of H
C{row}= cellfun(fun,num2cell(M),tmp, 'Uni',0);
row=row+1;
end

Sign in to comment.

More Answers (0)

Categories

Asked:

on 29 Nov 2017

Edited:

on 30 Nov 2017

Community Treasure Hunt

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

Start Hunting!