how to construct a cell array from another cell array

10 ビュー (過去 30 日間)
mohamed Faraj
mohamed Faraj 2019 年 8 月 15 日
コメント済み: mohamed Faraj 2019 年 8 月 19 日
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 件のコメント
mohamed Faraj
mohamed Faraj 2019 年 8 月 15 日
Hi Adam. The numbers are not important. Imagine we have a cell array of some length V{1}{1}=vec1, V{1}{2}=vec2, V{1}{3}=vec3, and also we have V{2}{1}=vec4, V{2}{2}=vec5, From the array V, I want to construct another cell array, SAY D, which ha all possible combinations of vectors {vec1, vec2,vec3} and {vec4,vec5}. However, we can not combine two vectors from the same set, e.g., we can not have vec1 and vec2 combined. I wand the cell array D to be for example D{1}{1}=vec1 and D{1}{2}=vec4. I hope this helps
Adam Danz
Adam Danz 2019 年 8 月 15 日
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.

サインインしてコメントする。

採用された回答

Adam Danz
Adam Danz 2019 年 8 月 15 日
編集済み: Adam Danz 2019 年 8 月 17 日
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 件のコメント
Adam Danz
Adam Danz 2019 年 8 月 16 日
編集済み: Adam Danz 2019 年 8 月 16 日
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.
Adam Danz
Adam Danz 2019 年 8 月 17 日
編集済み: Adam Danz 2019 年 8 月 19 日
I updated my answer with "version 2". It still uses ndgrid() but is not dependent on knowing how many subcells are in "V". Tested with your data successfully.

サインインしてコメントする。

その他の回答 (1 件)

mohamed Faraj
mohamed Faraj 2019 年 8 月 17 日
Hi Adam. Attached is the cell array allPaths_service. I also created a cell array DD which has two possible combinations from allPaths_service.
  1 件のコメント
mohamed Faraj
mohamed Faraj 2019 年 8 月 19 日
Thank you Adam. Thi s was very helpful. One last thing. I noticed that t
matGrid =
1 1
2 1
3 1
1 2
2 2
3 2
what if I want ti to be in this order
matGrid =
1 1
1 2
2 1
2 2
3 1
3 2
which means we first change the index of the right most column first.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by