Быстрые общие замены для ind2sub и sub2ind MATLAB - PullRequest
1 голос
/ 31 марта 2020

Как ни странно, я не смог найти общий ответ на этот простой вопрос. Один связанный ответ здесь является не общим.

sub2ind можно избежать, я полагаю, со следующей эквивалентностью [ здесь ]

sub2ind(size(A), row1, row2, row3, row4) эквивалентно row1+ (row2-1)*size(A,1) + (row3-1)*size(A,1) *size(A,2) + (row4-1)*size(A,1) *size(A,2) *size(A,3).

Между тем ind2sub для двух измерений (т. Е. Нет row3, row4 ....) можно избежать, так как:

i = rem(index-1,size(A,1))+1;
j = (index-i)/size(A,1)+ 1 ;

эквивалентно:

[i,j] = ind2sub(size(A),index);

Как мы обобщить ind2sub для 3D матриц и так далее? Меня не интересуют споры о том, следует ли нам этого избегать или нет.

1 Ответ

0 голосов
/ 31 марта 2020

Ваш код ind2sub можно обобщить, просто добавив еще один rem ко второму измерению:

i = rem(index-1, size(A,1)) + 1;
index = (index-i) / size(A,1) + 1;
j = rem(index-1, size(A,2)) + 1;
k = (index-i) / size(A,2) + 1;

Это на самом деле намного проще сделать с использованием индексации на основе нуля, поскольку он избавляется всех битов +1 и -1. Это будет обобщенный код для любого числа измерений:

index = index-1; % convert to 0-based indexing
sz = size(A);
i = zeros(size(sz));
for d = 1:numel(sz)
   i(d) = rem(index, sz(d));
   index = (index - i(d)) / sz(d);
end
i = i + 1; % convert back to 1-based indexing
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...