Merge 3D matrices into one cell array without using a loop

5 vues (au cours des 30 derniers jours)
mashtine le 24 Juin 2015
Modifié(e) : Stephen23 le 25 Juin 2015
I have three 3D matrices (mxnxt) that I would like to merge into a single array of mxn with each array holding the corresponding data from the original matrices. Thus {1,1} of the new array will have a tx3 matrix containing the data.
For instance, A, B and C are 10x10x300 matrices. How do I make D to be a 10x10 array where {1,1} is a 300x3 matrix, without using a loop, but simple vector indexing.
Hope this makes sense!

Réponse acceptée

Stephen23 le 24 Juin 2015
Modifié(e) : Stephen23 le 24 Juin 2015
Try this:
A = rand(10,10,300);
B = rand(10,10,300);
C = rand(10,10,300);
D = permute(cat(4,A,B,C),[3,4,1,2]); % join together, re-orient
V = ones(1,10);
D = squeeze(mat2cell(D,300,3,V,V)); % split into cell
And the output:
>> size(D)
ans =
10 10
>> size(D{1,1})
ans =
300 3
  4 commentaires
Stephen23 le 25 Juin 2015
Modifié(e) : Stephen23 le 25 Juin 2015
There are basically three ways of dealing with Big Data:
  1. Change the algorithm so that it is not necessary to hold all of the data in memory.
  2. Use tools designed to operate on Big Data.
  3. Buy lots more memory.
Do an [internet search engine] search for "MATLAB Big Data" and you will find lots of discussions on these topics. Well, mostly on the first two, but the third gets mentioned too!

Connectez-vous pour commenter.

Plus de réponses (1)

Matt J
Matt J le 25 Juin 2015
Modifié(e) : Matt J le 25 Juin 2015
There is no way to do it without for-loops. Note that mat2cell and friends are all mfiles that use loops internally.
The data organization you are pursuing is ill-advised. Instead of cell arrays, you should just cat() them into a 4D numeric array
Now to access a tx3 sub-array, you can do things like
It would have been much better and cleaner if you had instead made the original arrays tx1xmxn. That way, you could concatenate as
and your sub-arrays would be in more efficient memory-contiguous blocks and also more simply indexed as D(:,:,i,j). You can use permute() to achieve this, of course, but permute() is an expensive operation.


En savoir plus sur Matrices and Arrays 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