MATLAB: извлечение индексов из 3D-матрицы для другой 3D-матрицы - PullRequest
0 голосов
/ 29 марта 2020

У меня есть две трехмерные матрицы A и B того же размера и еще одна трехмерная матрица I того же размера, содержащая некоторые индексы, соответствующие первому измерению A. Я хочу сделать что-то вроде A(I)/B(I).

В частности, A(I(x,y,z),y,z) разделите его на B(I(x,y,z),y,z) для всех x,y,z. Как мне сделать это быстро, возможно, используя repmat или sub2ind или просто логическое индексирование?

Я знаю, как сделать это для 2D матриц очень эффективно. Если бы не было z измерения, я бы сделал:

dum_i = I+(x_size+1).*repmat(0:(y_size-1), x_size+1, 1);  % Create a linear index
C= A(dum_i)./B(dum_i);

1 Ответ

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

Поскольку и A, и B имеют одинаковый размер, я предполагаю, что вам нужно поэлементное деление ./

%Some random test data
A=rand(3,4,5);
B=rand(size(A));
I=zeros(size(A));
for d2=1:size(I,2)
    for d3=1:size(I,3)
        I(:,d2,d3)=randperm(size(I,1));
    end
end
%end of test data

%Second and third dimension are to be indexed directly, use ind2sub to genertae matching indices
[~,I2,I3]=ind2sub(size(A),1:numel(A));
%Generate a linear index, which does "I(x,y,z),y,z"
LI=sub2ind(size(A),I(:),I2(:),I3(:));
%Make the index the right shape:
LI=reshape(LI,size(A));
%Now linear indexing can be used to permute A and B in the intended way.
C=A(LI)./B(LI);

Для дальнейшего улучшения производительности вы можете:

  • Замените строку ind2sub некоторым выражением repmat.
  • Сделайте "C = A / B, C = C (I)". Который будет C2=A./B;C2=C2(LI);

Я думаю, что оба улучшат производительность, но, выполняя некоторые другие вычисления, я не могу ничего отметить в данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...