2

假设我有一个stack维度为 NxMxR 的数组。我想在给定维度上使用逻辑索引来更新其值,而不使用临时变量。

使用临时变量的示例:

for k=1:R
    temp=stack(:,:,k);
    temp(temp<max(max(temp))/2)=NaN;
    cropped(:,:,k)=temp;
end

请注意,如果整个数组的条件相同,但它会随着R维度而变化,这将是微不足道的。bsxfun如果我只想以如下语法减去阈值,那将是合适的:

cropped = bsxfun(@minus, stack, max(max(stack, [], 3))/2);

我发现临时变量的使用很笨拙,并且找不到定义函数的正确方法bsxfun来执行循环的功能。

有人有建议吗?

4

2 回答 2

2
stack(bsxfun(@minus, stack, max(max(stack))/2) < 0) = NaN;
于 2014-05-27T18:21:47.840 回答
2

另一种bsxfun实现 -

t1 = reshape(stack,size(stack,1)*size(stack,2),[])
t1(bsxfun(@lt,t1,max(t1)/2))=NaN
cropped = reshape(t1,size(stack))

多一个 -

t1 = max(reshape(stack,size(stack,1)*size(stack,2),[]))
stack(bsxfun(@lt,stack,permute(t1/2,[3 1 2])))=NaN

还有更多危险地接近路易斯的答案-

stack(bsxfun(@lt,stack,max(max(stack)/2)))=NaN
于 2014-05-27T18:30:54.100 回答