我正在尝试优化我正在编写的函数的速度,并尝试尽可能多地使用向量。我是Matlab的新手,向量化有时对我来说是可以理解的,但我希望得到一些额外的帮助。以下是我目前的代码:
需要注意的是,oracle()函数表示一个随机形状的对象,如果输入一个1x 2矩阵,它将返回矩阵(或者在我们的例子中,x-y坐标)是否在随机对象内部。
Code In Image
函数area = MitchellLitvinov_areaCalc(n)%创建随机坐标向量,其边界为(3,14)x = rand(n,1)* 11 + 3;y =兰德数(n,1)* 11 + 3;
% find every point that is inside of oracle
inOracle = oracle([x y]);
% calculate the proportion, and multiply total area by proportion to find area
% of oracle
numPointsInOracle = nnz(inOracle);
area = numPointsInOracle/n * (11*11);
% create variable to store number of points in the area, and create a
% matrix with size [numPoints, 2] to hold x and y values
oracleCoordinates = zeros(numPointsInOracle, 2);
% HERE IS WHERE I NEED ASSISTANCE!!!!!!!!!
% find the points that are in the oracle shape
index = 0; % start index at 0 % is the index of our oracleCoordinates matrix
for i = 1:n % have to go through every point again to get their index
% if point is inside oracle, increase index and record
% coordinates
if (inOracle(i) == 1) % see if point is in oracle
index = index + 1;
oracleCoordinates(index, 1) = x(i, 1);
oracleCoordinates(index, 2) = y(i, 1);
end
end
% plot all points inside the oracle
scatter(oracleCoordinates(:,1), oracleCoordinates(:,2))
title("Oracle Shape")
xlim([3, 14]);
ylim([3, 14]);
结束
是的,即使使用接近最大的内存使用,代码也会运行得相当快。但是我希望它完全矢量化,这仅仅是出于速度的原因,如果我需要重新使用这个代码来进行成像。目前,为了计算我使用矢量的区域,但为了实际再现图像,我需要创建一个单独的存储矩阵,然后手动使用索引/附加来传输oracle函数内部的点。我想知道是否有任何直接的“快捷方式”可以让我的绘图速度快一点。
1条答案
按热度按时间n6lpvg4x1#
您可以使用数组作为索引,从另一个数组中选择某些项。例如,使用变量名:
这应该会给予与问题中的代码相同的结果,而不使用循环。