1D array values to 2D matrix

I would like to 'convert' a 1D array to a 2D matrix considering the value inside the array as:
A =
1 3 5 4 3
B =
1 3 5 4 3
0 3 5 4 3
0 3 5 4 3
0 0 5 4 0
0 0 5 0 0
Can you suggest a fast way to do that?

 采纳的回答

A for-loop would make a cleaner read (I could provide that upon request) but here's two lines the do the trick.
base = cellfun(@(x)repmat(x,x,1), num2cell(A), 'UniformOutput', false);
cell2mat(cellfun(@(y,n) padarray(y,n, 'post'),base, num2cell(max(A)-A), 'UniformOutput', false))
ans =
1 3 5 4 3
0 3 5 4 3
0 3 5 4 3
0 0 5 4 0
0 0 5 0 0

6 个评论

Thanks, it worked nicely.
Just wondering.. keeping the same idea but instead to keep the number, get only the numer 1 in the cell function, like:
ans =
1 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 0 1 1 0
0 0 1 0 0
What should I do?
Your solution above is one way to do it. If you don't need the original matrix in the first place and want to bypass that,
% |-------| This is the only change
base = cellfun(@(x)ones(x,1), num2cell(A), 'UniformOutput', false);
cell2mat(cellfun(@(y,n) padarray(y,n, 'post'),base, num2cell(max(A)-A), 'UniformOutput', false))
Hy Adam.
How can I change for
ans =
1 1 1 1 1
0 2 2 2 2
0 3 3 3 3
0 0 4 4 0
0 0 5 0 0
Cheers!
A = [1,3,5,4,3]
A = 1×5
1 3 5 4 3
B = zeros(max(A),numel(A));
for i = 1:numel(A)
B(1:A(i),i) = 1:A(i);
end
disp(B)
1 1 1 1 1 0 2 2 2 2 0 3 3 3 3 0 0 4 4 0 0 0 5 0 0
Hi Adam, thanks for the answer. I was wondering something like your previous version but it works anyway.

请先登录,再进行评论。

更多回答(0 个)

类别

帮助中心File Exchange 中查找有关 Loops and Conditional Statements 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by