Borrar filtros
Borrar filtros

Covert a cell to multidimensional matrix

1 visualización (últimos 30 días)
Orion
Orion el 12 de Mzo. de 2016
Comentada: Orion el 14 de Mzo. de 2016
I have a 50 X 1 cell array, A, and each cell contains an m x 100 matrix, where m is variable and not the same for each of the cells. I would like to convert this cell array to a 3D matrix, Anew(M,100,50), where M is the first dimension of the matrix with biggest rows, and pad zero for the small matrices. I tried cell2mat but it concatenated the cell into a 2D matrix ([...],100). I also tried:
for ii=1:50
Anew(:,:,ii)=A{ii};
end
but I got
Subscripted assignment dimension mismatch.
error. Does anyone know how it can be done?
Thanks
This is the first 6 cells of A:
A =
[ 44x100 double]
[ 80x100 double]
[103x100 double]
[ 96x100 double]
[ 94x100 double]
[ 92x100 double]
.
.
.

Respuesta aceptada

Azzi Abdelmalek
Azzi Abdelmalek el 12 de Mzo. de 2016
%------------Example---------------------------
s=arrayfun(@(x) randi(5,randi(5),100),1:5,'un',0)
%---------------the code-------------------------
n=max(cellfun(@(x) size(x,1),s))
m=size(s{1},2)
a=cellfun(@(x) [zeros(n-size(x,1),m);x],s,'un',0)
out=cat(3,a)
  3 comentarios
Guillaume
Guillaume el 14 de Mzo. de 2016
Azzi made a mistake in the last line, it should be
out = cat(3, a{:});
Please use good variable names in your code, not m, n, a, etc. It makes the code so much easier to maintain:
%input cell array: c
maxheight = max(cellfun(@(m) size(m, 1), c);
resizedmatrices = cellfun(@(m) [m; zeros(maxheight - size(m, 1), size(m, 2)], c, 'UniformOutput', false);
out = cat(3, resizedmatrices{:});
Orion
Orion el 14 de Mzo. de 2016
thanks

Iniciar sesión para comentar.

Más respuestas (1)

Image Analyst
Image Analyst el 12 de Mzo. de 2016
Try this (untested) intuitive looping method:
Anew = zeros(m, 100, 50); % Initialize
for thisCellIndex = 1 : 50
% Extract contents of this particular cell.
% It will be a 1 x 100 row vector.
thismx100Array = A{thisCellIndex};
finalZ = min([size(Anew, 3), length(thismx100Array )]);
% Put this row vector into a column vector along the "Z" dimension.
for z = 1 : finalZ
Anew(1:m, 1:100, ii) = thismx100Array(z);
end
end
It's hard to do much more without your actual data.
  1 comentario
Orion
Orion el 14 de Mzo. de 2016
m is changing in each cell. but I think to use your suggestion, it should be the biggest first index of the matrices.

Iniciar sesión para comentar.

Categorías

Más información sobre Cell Arrays en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by