Matlab中的随机数生成和绘图

时间:2014-12-05 11:01:07

标签: matlab random plot

我编写了一个代码来生成10个随机数字(标签),并将它们显示在绘图上,并显示其坐标。这些随机数是固定的。我已经在代码中添加了3个红点(读取器),这些代码也应该随机生成但不能修复。当我添加代码来修复标签时,读者也变得固定,我只想修复标签。 我还想计算每个阅读器和标签之间的距离,即每个阅读器将有10个距离。我不知道如何做到这一点,并希望任何代码能够解释这一点。我的代码如下;

% 3 Readers, 10 tags at fixed positions 

A1 = 30; % area defined as 30 X 30 grid
N = 10;
R = 3; % 3 readers
s = rng; % fixed tags does not change position when simulated repatedly

% Generate x and y position of tags 
xtemp = A1*rand(1,N);
ytemp = A1*rand(1,N);
rng(s);
% Generate x and y position of points 
xtemp_2 = A1*rand(1,R);
ytemp_2 = A1*rand(1,R);

plot(xtemp,ytemp,'.',xtemp_2,ytemp_2,'rs','LineWidth',1,'MarkerEdgeColor','k','MarkerFaceColor','r','MarkerSize',8);  
grid on
hold off
axis([0 A1 0 A1])

% Tag formatting
xoffset = 0;
yoffset = -1;
fsize = 8;
temp_str = mat2cell(num2str([xtemp(:) ytemp(:)], '(%.2f,%.2f)'), ones(1,N));
text(xtemp+xoffset, ytemp+yoffset, temp_str,'fontsize', fsize)

enter image description here

2 个答案:

答案 0 :(得分:1)

如果您想在重新运行脚本时不重新计算xtempytemp,请使用exist

if ~exist('xtemp')        

    xtemp = A1*rand(1,N);
    ytemp = A1*rand(1,N);

end

如果您希望在MATLAB会话之间保持稳定,请将标记点保存到文件,并告诉脚本加载文件(如果这些变量不在工作区中)。

对于距离,如果您有统计工具箱,请查看pdist2。使用rand的输出方式,您需要重新整理数据:

% d is 10 x 3
d = pdist2([x;y]',[x2;y2]');

答案 1 :(得分:0)

这应该是一个例子。

  • 随机生成器在生成一次后停止固定点。
  • cDistance函数返回最初固定点与随机点之间的距离(作为列标题)
  • 如果我们将re_point设置为1
  • ,则可以重新创建固定点

我将您的代码封装到一个函数中,因此我们可以使用定义persistent变量。这种类型的变量保留在内存中。您的案例中的两个变量是xtempytemp(以及图句柄hFig,因此我们不必创建新的图形窗口)

function TESTING (re_point)
persistent xtemp ytemp hFig

变量re_point是一个可以定义为0或1的变量。如果没有参数运行,则默认变量是从此代码定义的。 nargin是通过

传递的函数的参数个数
    if nargin<1
        re_point = 0;
    end

如果已设置固定值的persistent变量x_tempy_temp,则无需设置值。此外,如果我们调用函数TESTING(1),则将值re_point设置为1,因此满足以下if语句,然后生成新的固定点

    if (isempty(xtemp) && isempty(xtemp)) || re_point == 1
        % Generate x and y position of tags 
        xtemp = A1*rand(1,N);
        ytemp = A1*rand(1,N);
    end

为了标记随机点,我使用text函数将每个随机点的值放置如下。

    for iter = 1:numel(xtemp_2)
        text(xtemp_2(iter),ytemp_2(iter), num2str(iter),...
            'FontSize',8,'HorizontalAlignment','center',...
            'Color','White','FontWeight','bold');
    end

有许多方法来编码距离的计算。我会让你找到更优雅的方式。我使用嵌套函数来做到这一点。嵌套函数在大多数(如果不是全部)情况下都受益于速度。缺点是任何嵌套函数都是父函数的本地函数。我只是浏览了每个固定点和随机点,并使用内置的pdist MATLAB函数,如下所示

    function S = distanceCalc
        S = size(numel(xtemp),numel(xtemp_2));
        for ri = 1:numel(xtemp)
            for fi = 1:numel(xtemp_2)
                S(ri,fi) = pdist([xtemp(ri),ytemp(ri);...
                            xtemp_2(fi),ytemp_2(fi)],...
                            'euclidean');
            end
        end
    end

以下是完整的代码

function TESTING (re_point)
% if re_point = 0 [default]
%     points generated for xtemp and y_temp remain fixed
% if re_point = 1
%     new points are generated for x_temp and y_temp


persistent xtemp ytemp hFig
if nargin<1
    re_point = 0;
end

A1 = 30; % area defined as 30 X 30 grid
N = 10;
R = 3; % 3 readers
s = rng; % fixed tags does not change position when simulated repatedly
rng(s)

if (isempty(xtemp) && isempty(xtemp)) || re_point == 1
    % Generate x and y position of tags 
    xtemp = A1*rand(1,N);
    ytemp = A1*rand(1,N);
end
if isempty(hFig)
    hFig = figure;
end

% Generate x and y position of points 
xtemp_2 = A1*rand(1,R);
ytemp_2 = A1*rand(1,R);

% plot data
plot(xtemp,ytemp,'.',xtemp_2,ytemp_2,'rs','LineWidth',1,'MarkerEdgeColor','k','MarkerFaceColor','r','MarkerSize',14);
for iter = 1:numel(xtemp_2)
    text(xtemp_2(iter),ytemp_2(iter), num2str(iter),...
        'FontSize',8,'HorizontalAlignment','center',...
        'Color','White','FontWeight','bold');
end
grid on
% hold off
axis([0 A1 0 A1])

% Tag formatting
xoffset = 0;
yoffset = -1;
fsize = 8;
temp_str = mat2cell(num2str([xtemp(:) ytemp(:)], '(%.2f,%.2f)'), ones(1,N));
text(xtemp+xoffset, ytemp+yoffset, temp_str,'fontsize', fsize)


cDistance = distanceCalc()

% distance function calculator
    function S = distanceCalc
        S = size(numel(xtemp),numel(xtemp_2));
        for ri = 1:numel(xtemp)
            for fi = 1:numel(xtemp_2)
                S(ri,fi) = pdist([xtemp(ri),ytemp(ri);...
                            xtemp_2(fi),ytemp_2(fi)],...
                            'euclidean');
            end
        end
    end

end