how to construct a cell array from another cell array
5 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
mohamed Faraj
el 15 de Ag. de 2019
Comentada: mohamed Faraj
el 19 de Ag. de 2019
I have a cell array with a variable number of cells and a variable number of elements within each cell. For instance, it could by V{1}{1}=1 2 3 4, V{1}{2}=3 4 1 0,V{1}{3}=3 5 -1 -9, and V{2}{1}=-1 -2 9, V{2}{2}= 0 9 6, i.e., the cell 1 has 3 vectors of length 4 elements and the cell 2 has 2 vectors of length 3. I want to construct another cell array such that it has all combinations of these vectors, here I could have 6 combinations (3*2=6). The new cell array has to be of length 6 cells (number of possible combinations), and each cell has a possible combinations, for example A{1}={1 2 3 4 and -1 -2 9} and A{2}={1 2 3 4 and 0 9 6} . Note that I will get these vectors from a matlab code so I do not know them in advance.
3 comentarios
Adam Danz
el 15 de Ag. de 2019
I set up some demo data "V" that fits your description and the output "D" also fits your description (see answers). If this doesn't fit your goal, please update us on how your data or your goal differs.
Respuesta aceptada
Adam Danz
el 15 de Ag. de 2019
Editada: Adam Danz
el 17 de Ag. de 2019
This fits the description from your comment under your question. It horizontally concatenates all combinations of the row vectors stored in V{1} and V{2}.
% Demo data
V{1}{1} = 1:4; % vec1 1x4
V{1}{2} = 2:5; % vec2 1x4
V{1}{3} = 3:6; % vec3 1x4
V{2}{1} = 1:3; % vec4 1x3
V{2}{2} = 2:4; % vec5 1x3
[v1idx, v2idx] = ndgrid(1:numel(V{1}), 1:numel(V{2}));
D = cellfun(@(a,b)horzcat(a,b),{V{1}{v1idx(:)}}, {V{2}{v2idx(:)}}, 'UniformOutput', false)
% D = {[vec1,vec4], [vec2,vec4], [vec3,vec4], [vec1,vec5], [vec2,vec5], [vec3,vec5]}
Version 2: when number of sub-cells in V is variable.
cellCount = num2cell(1:numel(V));
nCellIdx = cellfun(@(x)1:numel(x), V, 'UniformOutput', false);
cellGrid = cell(size(nCellIdx));
[cellGrid{:}] = ndgrid(nCellIdx{:});
matGrid = cell2mat(cellfun(@(x)x(:),cellGrid,'UniformOutput',false)); % Each row is the index for 1 cell
D = cell(1,size(matGrid,1));
for i = 1:size(matGrid,1)
D{i} = cellfun(@(ci,sci)V{ci}(sci),cellCount, num2cell(matGrid(i,:)));
end
D(i) contains the sub-cell indices listed in matGrid(i,:).
10 comentarios
Adam Danz
el 16 de Ag. de 2019
Editada: Adam Danz
el 16 de Ag. de 2019
Could you save "allPaths_service" to a mat file and attach it?
Also, could you provide a small example of the expected outcome (using real data). I know it would take time to manually produce the entire output but a few combinations would be helpful. For example, it's still unclear how a 1xn vector will be combined with a 1xm vector.
Más respuestas (1)
Ver también
Categorías
Más información sobre Matrix Indexing 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!