Effacer les filtres
Effacer les filtres

Creating a Combination of Multiple Arrays

7 vues (au cours des 30 derniers jours)
Rachel Anthony
Rachel Anthony le 9 Juil 2018
Commenté : Rachel Anthony le 12 Juil 2018
I'm having trouble coming up with code to create a combination between two arrays. In my first array, result, I computed the Cartesian product between the two vectors of A.
>> A = {[1 2 3], [4 5 6]}
c = cell(1,numel(A));
[c{:}] = ndgrid(A{:});
result = cell2mat(cellfun(@(v)v(:), c, 'UniformOutput', false) )
resulta =
1 4
2 4
3 4
1 5
2 5
3 5
1 6
2 6
3 6
My second array is:
resultb =
1 3
2 4
I am trying to create iterations between the rows of result and result b. To make it clearer, I want my output array to look like this:
resultc=
1 4 1 3
2 4 1 3
3 4 1 3
1 5 1 3
2 5 1 3
3 5 1 3
1 6 1 3
2 6 1 3
3 6 1 3
1 4 2 4
2 4 2 4
3 4 2 4
1 5 2 4
2 5 2 4
3 5 2 4
1 6 2 4
2 6 2 4
3 6 2 4
How would I create code to achieve this regardless of the sizes of matrices resulta and resultb? Thanks!

Réponse acceptée

OCDER
OCDER le 9 Juil 2018
combvec(resulta', resultb')'
  3 commentaires
OCDER
OCDER le 12 Juil 2018
I don't know a more direct way off the top of my head, but you could make a combination of indices of the cell arrays instead, and then assemble your combination cell array at the way end. See this example:
resulta = [
1 4
2 4
3 4
1 5
2 5
3 5
1 6
2 6
3 6];
resultb =[
1 3
2 4];
%Just making some example cell arrays
cella = num2cell(resulta);
cella{1} = 'a';
cellb = num2cell(resultb);
cellb{2} = 'b';
%1) create a joined matrix of size (Ma+Mb)x1
cellab = [cella(:); cellb(:)];
%2) find all combination of the linear indices of cella and cellb
IdxA = reshape(1:numel(cella), size(cella));
IdxB = reshape(1:numel(cellb), size(cellb)) + numel(cella); %Add numel(cella) at end because you want the linear index of cellab
ComboIdx = combvec(IdxA', IdxB')';
%3) now make your combination cell array
ComboCell = reshape(cellab(ComboIdx(:)), size(ComboIdx));
Rachel Anthony
Rachel Anthony le 12 Juil 2018
That works, thank you so much!

Connectez-vous pour commenter.

Plus de réponses (1)

Matt J
Matt J le 9 Juil 2018
Modifié(e) : Matt J le 9 Juil 2018
For those without the Neural Network Toolbox,
resultb=[1 3; 2 4];
A = {[1 2 3], [4 5 6],1:size(resultb,2)}
N=numel(A)-1;
[c{1:N+1}]=ndgrid(A{:});
result=[reshape( cat(N+1,c{1:N}) ,[],N ) ,resultb(c{N+1},:)]

Catégories

En savoir plus sur Data Type Conversion dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by