Как я могу построить контур пользовательской функции?

У меня есть пользовательская функция, которая возвращает либо 0, либо 1 в зависимости от двух заданных входных данных:

function val = myFunction(val1, val2)

  % logic to determine if val=1 or val=0

end

Как я могу создать контурный график функции по координатам x,y, сгенерированным следующей сеткой?

meshgrid(0:.5:3, 0:.5:3);

Этот график будет просто отображать, где функция 0 или 1 на контурной карте.


person Omar    schedule 24.09.2010    source источник
comment
Примечание. Возможно, вам следует использовать лучшее разрешение, чем 0,5, если только функция не работает очень медленно.   -  person Reinderien    schedule 24.09.2010


Ответы (2)


Если ваша функция myFunction не предназначена для обработки входных данных матрицы, вы можете использовать функцию ARRAYFUN. чтобы применить его ко всем соответствующим записям x и y:

[x,y] = meshgrid(0:0.5:3);      %# Create a mesh of x and y points
z = arrayfun(@myFunction,x,y);  %# Compute z (same size as x and y)

Затем вы можете использовать функцию CONTOUR для создания контурного графика для вышеуказанного данные. Поскольку ваши данные z имеют только 2 разных значения, вам, вероятно, имеет смысл построить только один уровень контура (который будет иметь значение 0,5, на полпути между вашими двумя значениями). Вы также можете вместо этого использовать функцию CONTOURF, которая создает заполненные контуры, которые четко покажут, где единицы и нули:

contourf(x,y,z,1);  %# Plots 1 contour level, filling the area on either
                    %#   side with different color


ПРИМЕЧАНИЕ. Поскольку вы рисуете данные, содержащие только единицы и нули, построение контуров может быть не лучшим способом их визуализации. Вместо этого я бы использовал что-то вроде функции IMAGESC, например:

imagesc(x(1,:),y(:,1),z);

Имейте в виду, что ось Y на этом графике будет перевернута относительно графика, сгенерированного КОНТУР.

person gnovice    schedule 24.09.2010

Следующее сделает это:

function bincontour
    clear; clc;

    xrange = 0:.5:3;
    yrange = 1:.5:5;
    [xmesh, ymesh] = meshgrid(xrange, yrange);
    z = arrayfun(@myFunction, xmesh, ymesh);

    contourf(xrange, yrange, z, 5)
end

function val = myFunction(val1, val2)
    val = rand() > 0.5;
end
person Reinderien    schedule 24.09.2010