Convert 2-D array to multidimensional array
5 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
I have a 2-D array with 7 columns that I want to convert to a 6-D array of dimensions 16*20*22*6*3*2. The values in the first 5 columns of the 2-D array are the first 5 indices of the 6-D array and the values in the 6th and 7th columns of the 2-D array shall be contained in the 6th dimension of the 6-D array.
I tried the following
misc(rslts1(:,1:5),1:2) = rslts1(:,6:7)
where misc is the 6-D array and rslts1 is the 2-D array but got the error "Subscripted assignment dimension mismatch"
0 Commenti
Risposta accettata
Guillaume
il 6 Apr 2016
Modificato: Guillaume
il 6 Apr 2016
Using accumarray, you would have to duplicate your columns 1 to 5, once with 1 appended, then with 2 appended, to create the destination subscripts, and reshape the last two columns into one column:
misc = accumarray([rslts1(:, 1:5), 1; rslts1(:, 1:5), 2], reshape(rslts1(:, 6:7), [], 1));
Alternatively, you can use your syntax twice, and concatenate along the 6th dimension:
misc = cat(6, accumarray(rslts1(:, 1:5), rslts1(:, 6)), accumarray(rslts1(:, 1:5), rslts1(:, 7)));
Using sub2ind, while technically more correct, is more complicated:
misc = zeros(16, 20, 22, 6, 3, 2);
idxs = [repmat(rslts1(:, 1:5), 2, 1), repelem([1; 2], size(rslts1, 1))]; %another way to create the same matrix used in accumarray
misc(sub2ind(size(misc), idxs(:, 1), idxs(:, 2), idxs(:, 3), idxs(:, 4), idxs(:, 5), idxs(:, 6)) = rslts1(:, 6:7)
or to avoid all of these arguments in the sub2ind call (but the conversion to cell array will make the execution slower):
misc = zeros(16, 20, 22, 6, 3, 2);
idxs = num2cell([repmat(rslts1(:, 1:5), 2, 1), repelem([1; 2], size(rslts1, 1))], 1);
misc(sub2ind(size(misc), idxs{:})) = rslts1(:, 6:7)
edit: I also suggested using sparse, but that only works for 2D matrices.
2 Commenti
Guillaume
il 6 Apr 2016
Do'h! Of course, trying to horzcat a column vector with a matrix is not going to work.
You can either use the construct I used in the sub2ind example:
[repmat(rslts1(:, 1:5), 2, 1); repelem([1; 2], size(rslts1, 1))];
or
[rslts1(:, 1:5), repmat(1, size(rslts1, 1), 1); rslts1(:, 1:5), repmat(2, size(rslts1, 1), 1)]
or
[[rslts1(:, 1:5); rslts1(:, 1:5)], repelem([1; 2], size(rslts1, 1))]
Più risposte (2)
Steven Lord
il 6 Apr 2016
Either use accumarray or sub2ind depending whether there are repeated values for the same coordinate that you want to accumulate or not.
2 Commenti
Kuifeng
il 6 Apr 2016
How about the function reshape? Take one column for example, Assume there is 126720 data. Make some changes for more columns.
a = rand([126720 1]);
a_5D = reshape(a,[16 20 22 6 3])
1 Commento
Vedere anche
Categorie
Scopri di più su Matrices and Arrays in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!