Подтвердить что ты не робот

Как я могу индексировать трехмерную матрицу с 2-D маской в ​​MATLAB?

Предположим, что у меня есть D, матрица данных X-by-Y-by-Z. У меня также есть M, матрица "маскировки" X-by-Y. Моя цель - установить элементы (Xi, Yi,:) в D на NaN, когда (Xi, Yi) в M ложно.

Есть ли способ избежать этого в цикле? Я попытался использовать ind2sub, но это не удалось:

M = logical(round(rand(3,3))); % mask
D = randn(3,3,2); % data

% try getting x,y pairs of elements to be masked
[x,y] = ind2sub(size(M),find(M == 0));
D_masked = D;
D_masked(x,y,:) = NaN; % does not work!

% do it the old-fashioned way
D_masked = D;
for iX = 1:size(M,1)
    for iY = 1:size(M,2)
        if ~M(iX,iY), D_masked(iX,iY,:) = NaN; end
    end
end

Я подозреваю, что мне не хватает чего-то очевидного здесь. (

4b9b3361

Ответ 1

Вы можете сделать это, реплицируя свою логическую маску M по третьему измерению с помощью REPMAT, чтобы он был того же размера, что и D. Затем отложите:

D_masked = D;
D_masked(repmat(~M,[1 1 size(D,3)])) = NaN;

Если повторная копирование маски маски нежелательно, есть еще одна альтернатива. Сначала вы можете найти набор линейных индексов, где M равно 0, затем повторите набор size(D,3) раз, затем смените каждый набор индексов на кратность numel(M), чтобы он индексировал другую часть D в третьего измерения. Я проиллюстрирую это здесь, используя BSXFUN:

D_masked = D;
index = bsxfun(@plus,find(~M),(0:(size(D,3)-1)).*numel(M));
D_masked(index) = NaN;

Ответ 2

Мой Matlab немного ржавый, но я думаю, что логическая индексация должна работать:

D_masked = D;
D_masked[ M ] = NaN;

(который, вероятно, может быть объединен в один оператор с условным выражением на rhs...)