Convert 2-D array to multidimensional array

조회 수: 4 (최근 30일)
Jim
Jim 2016년 4월 6일
댓글: Guillaume 2016년 4월 6일
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"

채택된 답변

Guillaume
Guillaume 2016년 4월 6일
편집: Guillaume 2016년 4월 6일
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
Jim
Jim 2016년 4월 6일
I get an error with the first example |??? Error using ==> horzcat CAT arguments dimensions are not consistent.| and I'm trying to understand the source of it. Seems that there should be another grouping of terms in the generation of the destination subscripts.
Guillaume
Guillaume 2016년 4월 6일
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))]

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Steven Lord
Steven Lord 2016년 4월 6일
Either use accumarray or sub2ind depending whether there are repeated values for the same coordinate that you want to accumulate or not.
  댓글 수: 2
Jim
Jim 2016년 4월 6일
I don't understand how to use sub2ind for this. I don't see how to make use of the linear index that it would provide.
Jim
Jim 2016년 4월 6일
편집: Jim 2016년 4월 6일
I understand how I can use accumarray a little better. I'm thinking of using it something like
misc = accumarray(rslts1(:,1:5), rslts1(:,6));
but I think that's not quite right. This will be assigning the values in | rslts1(:,6)| to the 5th dimension of misc instead of the 1st column of the 6th dimension.

댓글을 달려면 로그인하십시오.


Kuifeng
Kuifeng 2016년 4월 6일
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
Guillaume
Guillaume 2016년 4월 6일
편집: Guillaume 2016년 4월 6일
The only way that reshape would work is in the unlikely case that the indices in the first five columns happened to be ordered linearly with no gaps and no repetition. In that case, there actually would be no need for the 5 index columns.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Matrices and Arrays에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by