如何绘制沿线的正态分布?

时间:2017-03-28 13:21:45

标签: matlab loops iteration

我正在研究matlab代码,以便沿着一条线绘制正态分布样本。 为这个问题保持简单,我使用的是y=10行。

A=randn(300,2);
x=A(:,1)';
y=A(:,2)';
x=[1.5*x(1:100)+5 1.5*x(101:200)+10 1.5*x(201:300)+15];
y=[1.5*y(1:100)+10 1.5*y(101:200)+10 1.5*y(201:300)+10];
plot(x,y,'Marker','.','LineStyle','none')
axis ( [ 1 20 1 20 ] ) ;

目的是:

Normal Distribution Along a Line

我的问题是,这段代码似乎非常低效,尤其是这两行:

x=[1.5*x(1:100)+5 1.5*x(101:200)+10 1.5*x(201:300)+15];
y=[1.5*y(1:100)+10 1.5*y(101:200)+10 1.5*y(201:300)+10];

在我的实际代码中,这将扩展为类似

x=[1.5*x(1:100)+5 1.5*x(101:200)+10 1.5*x(201:300)+15 1.5*x(301:400)+20 1.5*x(401:500)+25 ................];

有没有办法通过使用循环或矢量化来提高效率?我想了解如何做到这一点,但我只能找到简单的例子。我无法理解如何使用两个变量进行迭代,一个在范围部分x(201:300)....x(301:400)中,另一个在加法部分+15...+20

另外,我使用的这种技术是用正确的技术沿着线绘制正态分布样本,还是有更好/更简单的方法?

2 个答案:

答案 0 :(得分:2)

您通过将A乘以常数值(1.5)来构建x和y,然后将其分成几个部分(1:100,101:200,201:300 ......)并对每个范围应用不同的偏移量。

您可以直接对A执行此操作。为了便于阅读,我将其拆分为两行,但您可以在一行中完成。

% Build offsets:
n = 10;                 % number of parts with 100 samples each
step = 5;               % offset step: 5 -> 5, 10, 15, ... 
Offset = ones(100,n);  
Offset = bsxfun(@times,step:step:step*n,Offset);
Offset = Offset(:);

% Multiply by 1.5
A = 1.5 * randn(n*100,2);  

% Add offset to both X and Y
%A = bsxfun(@plus,A,Offset); 

% or add offset only to X and leave Y without offset:
A(:,1) = A(:,1) + Offset;


plot(A(:,1), A(:,2), 'Marker', '.', 'LineStyle', 'none')
%axis ([ 1 20 1 20 ]) ;

结果将偏移应用于X和Y. Result applying Offsets to both X and Y

答案 1 :(得分:1)

您可以使用bsxfun完成所需的操作:将不同维度中的每种变体对齐,让单身扩展计算所有"组合":

A = randn(300,2);
offsets_x = [5 10 15]; % Or offsets_x = (1:size(A,1)/chunk_size)*5
offsets_y = [10 10 10];
chunk_size = 100;
x = bsxfun(@plus, 1.5*reshape(A(:,1), chunk_size, []), offsets_x);
y = bsxfun(@plus, 1.5*reshape(A(:,2), chunk_size, []), offsets_y);
x = x(:).';
y = y(:).';

从Matlab R2016开始,感谢implicit expansion您可以用更简单的<{p}}替换bsxfun

x = 1.5*reshape(A(:,1), chunk_size, []) +  offsets_x;
y = 1.5*reshape(A(:,2), chunk_size, []) +  offsets_y;