我试图找出一种方法在Matlab中绘制一个接受k
参数并返回3D点的函数图。目前,我已经将此工作用于两个变量m
和n
。如何将此过程扩展为任意数量的参数?
K = zeros(360*360, number);
for m = 0:5:359
for n = 1:5:360
K(m*360 + n, 1) = cosd(m)+cosd(m+n);
K(m*360 + n, 2) = sind(m)+sind(m+n);
K(m*360 + n, 3) = cosd(m)+sind(m+n);
end
end
K(all(K==0,2),:)=[];
plot3(K(:,1),K(:,2),K(:,3),'.');
end
您在上面看到的代码是针对类似问题但不完全相同的。
答案 0 :(得分:2)
大多数情况下,您可以使用ndgrid
以矢量化方式执行此操作。
[M, N] = ndgrid(0:5:359, 1:5:360);
X = cosd(M)+cosd(M+N);
Y = sind(M)+sind(M+N);
Z = cosd(M)+sind(M+N);
allZero = (X==0)&(Y==0)&(Z==0); % This ...
X(allZero) = []; % does not ...
Y(allZero) = []; % do ...
Z(allZero) = []; % anything.
plot3(X,Y,Z,'b.');
一点解释:
致电[M, N] = ndgrid(0:5:359, 1:5:360);
会生成所有组合,其中M
是0:5:359
的元素,而N
是1:5:360
的元素。这将采用两个矩阵M
和N
的形式。如果您愿意,可以使用M = M(:); N = N(:);
将这些矩阵重新整形为向量,但这里不需要这样做。
如果你还有另一个变量,你可以使用:[M, N, P] = ndgrid(0:5:359, 1:5:360, 10:5:1000)
。
顺便说一下:删除条目[0,0,0]
的代码部分在此处不执行任何操作,因为此值不会显示。我看到你只需要它,因为你分配的内存比你实际需要的多得多。以下是原始代码的两个版本,它们不如ndgrid
版本好,但比原始版本更好:
m = 0:5:359;
n = 1:5:360;
K = zeros(length(m)*length(n), 3);
for i = 1:length(m)
for j = 1:length(n)
nextRow = (i-1)*length(n) + j;
K(nextRow, 1) = cosd(m(i)) + cosd(m(i)+n(j));
K(nextRow, 2) = sind(m(i)) + sind(m(i)+n(j));
K(nextRow, 3) = cosd(m(i)) + sind(m(i)+n(j));
end
end
或更简单,但有点慢:
K = [];
for m = 0:5:359
for n = 1:5:360
K(end+1,1:3) = 0;
K(end, 1) = cosd(m)+cosd(m+n);
K(end, 2) = sind(m)+sind(m+n);
K(end, 3) = cosd(m)+sind(m+n);
end
end