【问题标题】:Dimension-wise logical indexing in a 3D array3D 数组中的维度逻辑索引
【发布时间】:2014-05-27 18:07:47
【问题描述】:

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

使用临时变量的示例:

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 定义函数以执行循环的正确方法。

有人有建议吗?

【问题讨论】:

  • =NaN 部分存在错误...
  • @natan 正确,甚至更笨拙。谢谢。
  • 简而言之,您有一个 3d 数组,并且您想编辑每个 2d 切片,以便 NaN 替换该切片的值
  • @natan 是正确的,或者使用给定切片的值进行其他操作。

标签: arrays matlab multidimensional-array bsxfun


【解决方案1】:
stack(bsxfun(@minus, stack, max(max(stack))/2) < 0) = NaN;

【讨论】:

    【解决方案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
    

    还有更多危险地接近Luis's answer -

    stack(bsxfun(@lt,stack,max(max(stack)/2)))=NaN
    

    【讨论】:

    • 感谢您的宝贵时间,@Luis 先出手,但您的回答也很有帮助。
    • @Jigg 没关系,他完全应得的,因为他从您的bsxfun 代码领导!我很高兴发布与bsxfun 相关的内容 :) 问题也很有趣!
    猜你喜欢
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 2013-11-04
    相关资源
    最近更新 更多