我是Matlab的新手并且正在努力理解数组符号的概念(来自Perl背景)。
假设我们有两个随机向量(X
,Y
),它们是2D中的坐标(范围-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
);
现在我只想保留圈内各点的值,因此会从-1
中删除所有C
(前> = 0值)值,这可以通过以下方式完成:
C(C < 0) = 0;
我发现没有明显的方法将后一个表达式与前一个包含在一个表达式中,因为我没有找到即将创建和修改的临时数组 - ,“签名”和“否定”运算符可以“解决”以使用C(C < 0) = 0
执行另一个“步骤”。这有可能吗?
修改:
根据丹的评论,我可以将整个表达简化为:
C = ( (X.^2 + Y.^2) - r^2 ) < 0;
这正是我所寻求的。非常感谢你!我不认为这个在Matlab中是可能的......
答案 0 :(得分:1)
在您的具体情况下,我认为您可以将其等同于1:
C = -sign((X.^2 + Y.^2) - r^2) == 1;
或
C = -sign((X.^2 + Y.^2) - r^2) > 0;
因为你的输出到底只是1
和0
的矩阵所以你也可以利用Matlab的逻辑数据类型
但是解决临时矩阵并不是在Matlab中做事的方法。通常你会把它留作两行代码。但如果你真的想要,我认为你可以使用subsref
函数来完成它。