N-мерный тензор тождества в Matlab - PullRequest
0 голосов
/ 20 февраля 2019

Функция eye не поддерживает N-мерные массивы.

Я хотел бы создать такую ​​матрицу, чтобы

I(i,j,:,:)=eye(3,3)

в векторном виде, без необходимости циклически перебирать i и j.

Каков наилучший способ сделать это?Я не смог ничего найти в документации.

1 Ответ

0 голосов
/ 20 февраля 2019

Вы можете использовать repmat, чтобы повторить eye в 3-м и 4-м измерениях, и использовать shiftdim, чтобы сместить измерения

% for i = 1 to M, and j = 1 to N
k = shiftdim( repmat( eye(3,3), 1, 1, M, N ), 2 );

Вывод неприятный, потому что MATLAB не отображает> 2D данные очень хорошо, но вот пара тестов:

% Test that a given i-j pair gives eye(3,3) in the 3rd and 4th dimension
isequal( k(1,2,:,:), reshape( eye(3,3), 1, 1, 3, 3 ) ); % = 1, passed
% Test I-j slices are equal and i/j are oriented correctly. Test with M ~= N
isequal( k( 1, 1, :, : ), k( M, N, :, : ) ); %  = 1, passed

А вот фактический результат среза

% Below is equivalent to eye(3,3) in the 3rd and 4th dimensions
k(3,4,:,:)
ans(:,:,1,1) =
     1
ans(:,:,2,1) =
     0
ans(:,:,3,1) =
     0
ans(:,:,1,2) =
     0
ans(:,:,2,2) =
     1
ans(:,:,3,2) =
     0
ans(:,:,1,3) =
     0
ans(:,:,2,3) =
     0
ans(:,:,3,3) =
     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...