【问题标题】:Random number generation and plotting in MatlabMatlab中的随机数生成和绘图
【发布时间】:2015-02-03 12:50:33
【问题描述】:

我编写了一个代码来生成 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)

【问题讨论】:

  • 如果您显示情节并可能在其上手动绘制一些东西以展示您想要实现的目标会更好。
  • 在图像中,我希望黑点在第一次执行后保持静止,然后红点应该四处移动。然后我想知道如何计算每个红点和黑点之间的距离。所以每个红点将有 10 个距离对应每个黑点

标签: matlab random plot


【解决方案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和2。第一组应该是固定的,第二组是随机生成的
  • 删除 rng 的东西,这样你就不会重置随机数生成器,而单独留下 xtemp2 的东西(所以它每次都会重新运行)。
【解决方案2】:

举个例子应该没​​问题。

  • 随机生成器停止一次生成一次的固定点。
  • 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

如果您的固定值x_tempy_temppersistent 变量已经设置,我们不需要设置这些值。此外,如果我们调用了函数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

【讨论】:

  • 您能否分别显示您实际更改的内容?例如,将回答问题的 sn-p 放在顶部,画一条水平线,然后将例如整个函数放在下面。按照目前的答案,很难看出你做了什么。
  • 谢谢,这就是我想要的。红点上的编号也很有帮助。虽然我不理解代码,但希望代码中的一些 cmets 或这里的解释能提高我的理解。
  • @Duanne 我写了更多评论。将函数名称 TESTING 更改为更好的名称。为什么我把它大写我不知道大声笑
猜你喜欢
  • 2010-12-25
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多