How to place NaN at diagonal position in cell array?

5 views (last 30 days)
hey all
a={[],-1,-1,0.8,-0.7,[],[]; [],[],0.9,1,[],-0.9,0.6; -1,[],[],0.9,0.2,[],0.8}
how to place diagonal value in each row of 'a'. Diagonal value can be [] or NaN. Like this
out={NaN,[],-1,-1,0.8,-0.7,[],[]; [],NaN,[],0.9,1,[],-0.9,0.6; -1,[],NaN,[],0.9,0.2,[],0.8}
  3 Comments
Tha saliem
Tha saliem on 6 Mar 2018
yes a is 3x7 matrix while out will be of 3x8.. one place for diagonal value will be added
Tha saliem
Tha saliem on 7 Mar 2018
Thanks to all for giving useful answers. I am accepting answer based on efficiency of approach as i have to apply it on a large dataset.. Thanks again :)

Sign in to comment.

Accepted Answer

Andrei Bobrov
Andrei Bobrov on 6 Mar 2018
Edited: Andrei Bobrov on 6 Mar 2018
a={[],-1,-1,0.8,-0.7,[],[]; [],[],0.9,1,[],-0.9,0.6; -1,[],[],0.9,0.2,[],0.8};
[m,n] = size(a);
z = sort([repmat(1:n,m,1),(1:m)' - .5],2);
t = rem(z.',1) == 0;
out = cell(size(t));
out(t) = a';
out(~t) = {nan};
out = out';
or
a={[],-1,-1,0.8,-0.7,[],[]; [],[],0.9,1,[],-0.9,0.6; -1,[],[],0.9,0.2,[],0.8};
[m,n] = size(a);
out = num2cell(nan(m,n+1));
out(triu(true(m,n+1),1)) = a(triu(true(m,n)));
out(tril(true(m,n+1),-1)) = a(tril(true(m,n),-1));

More Answers (3)

James Tursa
James Tursa on 6 Mar 2018
Assuming there are at least as many columns as rows:
[m,n] = size(a);
out = cell(n+1,m);
x = logical(eye(size(out)));
out(~x) = a';
out(x) = {nan};
out = out';

Jos (10584)
Jos (10584) on 6 Mar 2018
a={[],-1,-1,0.8,-0.7,[],[]; [],[],0.9,1,[],-0.9,0.6; -1,[],[],0.9,0.2,[],0.8}
sz = size(a)
out = repmat({NaN}, sz + [0 1])
tf = triu(true(sz))
tfc = false(sz(1),1)
out([tfc tf]) = a(tf)
out([~tf tfc]) = a(~tf)
(btw, why use cell arrays?)
  1 Comment
Tha saliem
Tha saliem on 7 Mar 2018
Thank You for your time.. Actually this cell array is a result of some mathematical calculation so i have to use it as a cell array.

Sign in to comment.


Jos (10584)
Jos (10584) on 6 Mar 2018
Put NaNs on the diagonal:
tf = eye(size(a))==1
a(tf) = {NaN}
  1 Comment
Tha saliem
Tha saliem on 6 Mar 2018
Thankyou for answering but it replaces the diagonal value with NaN. I want to create a new place for Diagonal value and put NaN at that place. Other values remains same

Sign in to comment.

Categories

Find more on Operating on Diagonal Matrices in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!