Giả sử tôi có D, ma trận dữ liệu X-by-Y-by-Z. Tôi cũng có M, một ma trận "mặt nạ" X-by-Y. Mục tiêu của tôi là để thiết lập các yếu tố (Xi, Yi, :) trong D để NaN khi (Xi, Yi) trong M là sai.Làm cách nào để lập chỉ mục ma trận 3-D với mặt nạ 2-D trong MATLAB?
Có cách nào để tránh thực hiện việc này trong vòng lặp không? Tôi đã thử sử dụng ind2sub
, nhưng điều đó không thành công:
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
Tôi nghi ngờ tôi đang thiếu điều gì đó hiển nhiên ở đây. (:
ah, tất nhiên, nó hoạt động. cho kích thước khổng lồ của D và M mặc dù nó vẫn có thể được mong muốn không phải sao chép nó ... –
@Matt: Vì 'M' là một ma trận logic, nó chỉ sử dụng 1 byte cho mỗi phần tử, vì vậy sao chép nó sẽ không sử dụng lên gần như nhiều bộ nhớ như là ma trận nhân đôi của đôi. Trong thực tế, phiên bản nhân bản của 'M' sẽ chỉ sử dụng 1/8 tổng bộ nhớ mà' D' làm. – gnovice
@Matt: Để hoàn thành, tôi đã thêm một giải pháp khác để tránh sao chép 'M'. Nếu chỉ có một vài giá trị bằng không trong một ma trận rất lớn 'M', thì giải pháp mới này có thể được mong muốn hơn từ quan điểm sử dụng bộ nhớ. – gnovice