2015-01-06 5 views
0

Я пытаюсь выяснить способ сделать график функции в Matlab, который принимает параметры k и возвращает трехмерную точку. В настоящее время у меня это работает для двух переменных m и n. Как я могу расширить этот процесс до любого количества параметров?Как построить функцию нескольких переменных в Matlab?

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 

Код, который вы видите выше, относится к аналогичной проблеме, но не совсем то же самое.

ответ

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 
Смежные вопросы