我正在研究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 ] ) ;
目的是:
我的问题是,这段代码似乎非常低效,尤其是这两行:
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
另外,我使用的这种技术是用正确的技术沿着线绘制正态分布样本,还是有更好/更简单的方法?
答案 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 ]) ;
答案 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;