Существует ли какой-либо оператор сравнения, применяемый для матриц в Matlab, например оператор точки '. *', './', '. ^' - PullRequest
0 голосов
/ 06 мая 2011

У меня есть функция F, как это

function z=f(x,y)
    if(x<1 & y <1)
        z=0;
    else
        z=1;
    end
 end 

и скрипт

x=0:0.1:2;
y=0:0.1:2;
[X,Y]=meshgrid(x,y);
Z=f(X,Y);
mesh(X,Y,Z);

При запуске этого скрипта я получил следующие ошибки: Z должен быть матрицей, а не скаляром или вектором.

Это потому, что x и y - это два массива, а не скалярное значение. Скрипт можно запустить, если я изменю

function f looks like this:
     function z = f( x,y )
     for i=1:size(x,2)
         for j=1:size(y,2)
             if(x(i)<1 & y(j)<1)
                 z(i,j)=0;
             else
                 z(i,j)=1;
             end
         end
     end
     end

Проблема в том, что новая функция работает намного медленнее, чем первая. Я не знаю, есть ли какой-либо оператор сравнения, применяемый для массивов в этом случае, например оператор ". *", Используемый в этой функции

function z=f(x,y)
    z=x.*y;
 end

Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 06 мая 2011

Вы получаете ошибку, потому что функция f(x,y) возвращает скаляр для z, а mesh ожидает, что z будет матрицей. Вы можете заменить все приведенные выше функции и код на простое, быстрое векторизованное решение, которое использует логическое индексирование :

x=0:0.1:2;
y=0:0.1:2;
[X,Y]=meshgrid(x,y);
Z=ones(size(X));
Z(X(:)<1&Y(:)<1)=0;

mesh(X,Y,Z)

Это дает следующий рисунок

enter image description here

0 голосов
/ 06 мая 2011

процитировать мистера Макки: петли с индексированными матрицами плохи, ладно? Это занимает много времени, ладно?

Я изменю код Йоды на ступеньку ради эффективности:

x=0:0.1:2;
y=0:0.1:2;
[X,Y]=meshgrid(x,y);
Z = ((X>1) | (Y>1))*1;
mesh(X,Y,Z);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...