dt1 dt2 dt3 dt
1 3 6 10
2 4 1 5
3 6 5 3
4 7 4 1
5 1 2 4
6 2 8
7 8
8
9
10
I have the above data which I want to combine in one single matrix (10 x 4). The maximum number of rows is 10. I created a zeros
matrix. However, I have a problem since the data doesn't have the same dimensions. How it is possible to get the output as below? Should I sort th开发者_高级运维e data and replace the missing values with 0?
1 1 1 1
2 2 2 0
3 3 0 3
4 4 4 4
5 0 5 5
6 6 6 0
7 7 0 0
8 8 8 0
9 0 0 0
10 0 0 10
Here is the modified version of @gnovice's answer to a previous, similar question
%# group the variables. If you would be generating them in a loop, you could use the loop
%# to group them, i.e. have something like
%# for i=1:n
%# dtCell{i} = "function that generates dt_i"
%# end
dtCell = {dt1,dt2,dt3,dt};
nCells = length(dtCell);
maxVal = max(cellfun(@max,dtCell)); %# this way, I don't have to know vector orientation
%# you could replace the loop with calls to cellfun.
%# While this may make you feel more Matlab-ish, it wouldn't be
%# faster, or more readable
out = zeros(maxVal,nCells);
for iCell = 1:nCells
idx = dtCell{iCell}; %# this assignment is just for clarity
out(idx,iCell) = idx;
end
Let's define example data:
dt1 = randi(10,10,1)-1;
dt2 = randi(10,7,1)-1;
dt3 = randi(10,6,1)-1;
dt4 = randi(10,5,1)-1; %// example data. Column vectors.
One approach is to create a mask with bsxfun
and then fill values at the positions indicated by the mask:
dt = {dt1, dt2, dt3, dt4}; %// collect data into a cell array
n = cellfun(@numel, dt); %// length of each vector
mask = bsxfun(@le, (1:max(n)).', n); %// create mask
result = zeros(size(mask)); %// initiallize result with zeros
result(mask) = vertcat(dt{:}); %// fill in values.
Example result (with random data):
result =
2 3 2 7
3 9 8 6
4 7 9 0
4 3 5 7
2 1 1 1
1 7 7 0
8 0 0 0
1 0 0 0
7 0 0 0
8 0 0 0
精彩评论