【问题标题】:Matlab - inplace operation on anonymous arrayMatlab - 对匿名数组的就地操作
【发布时间】:2014-10-07 13:29:21
【问题描述】:

我是 Matlab 新手,正在努力理解数组表示法的概念(来自 Perl 背景)。

假设我们有两个随机向量 (X,Y),它们是二维坐标(范围 -r ... r),我们想找出哪些点 (x, y) 位于在半径为r 的圆内。这将是我们的设置:

 n = 100000000;              % point number
 r = 1;                      % circle size
 X = (rand(1,n) .* 2*r) - r; % generate coordinates (-r .. r)
 Y = (rand(1,n) .* 2*r) - r; 

据我了解,Matlab 几乎可以做任何完全矢量化的坐标分类(在C 中):

 C =  -                          ... % negate sign, 1: within, 0,-1: outside
      sign(                      ... % -1: within, 0,1: outside
            (X.^2 + Y.^2) - r^2  ... % calculate distance
          );

现在我想只保留圆内点的值,因此从 C 中删除所有 -1(以前 >=0 值)值,这可以通过以下方式完成:

 C(C < 0) = 0;

我没有找到明显的方法将后一个表达式与前一个表达式包含在一个表达式中,因为我没有发现即将创建和修改的临时数组是如何被距离- 、符号和否定运算符可以被“寻址”以使用C(C &lt; 0) = 0 执行另一个“步骤”。这可能吗?

编辑

根据 Dan 下面的评论,我可以将整个表达式简化为:

 C = ( (X.^2 + Y.^2) - r^2 ) < 0;

这正是我所寻找的。非常感谢你!我不认为 在 Matlab 中是可能的......

【问题讨论】:

  • 我想你想要&gt; 0,因为你现在将元素设置为1,而不是像以前那样设置为0
  • @Dan 我试图得到 1-s 结果有可能在以后做一个sum()-/sign()sequence 只是尝试到达那里(我不知道更好)
  • 啊,我没有看到你改变了它。这样会好很多。

标签: matlab expression


【解决方案1】:

在您的具体情况下,我认为您可以将其等同于 1:

C =  -sign((X.^2 + Y.^2) - r^2) == 1;

C =  -sign((X.^2 + Y.^2) - r^2) > 0;

因为你的输出最终只是1s 和0s 的矩阵,所以你不妨利用Matlab 的逻辑数据类型

但在 Matlab 中处理临时矩阵并不是真正的方法。通常,您只需将其保留为两行代码。但如果你真的很想,我认为你可以使用subsref 函数来做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多