Существует ли какой-либо оператор сравнения, применяемый для матриц в Matlab, например, оператор dot ‘.*’, ‘./’, ‘.^’

#matlab #matrix #dot-operator

#matlab #матрица #оператор dot

Вопрос:

У меня есть функция f, подобная этой

 function z=f(x,y)
    if(x<1 amp; 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 amp; 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
  

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

Ответ №1:

Вы получаете сообщение об ошибке, потому что функция 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(:)<1amp;Y(:)<1)=0;

mesh(X,Y,Z)
  

Это приводит к следующему рисунку

введите описание изображения здесь

Комментарии:

1. большое вам спасибо. Идея использования логического индексирования великолепна. Мои проблемы решены.

2. @Джеймс: Рад, что помог. Возможно, вы не знаете об этом, но вы можете пометить ответ как «принятый», установив флажок рядом с ответом, чтобы другим, у кого может возникнуть такая же проблема, было проще найти решение, которое сработало.

Ответ №2:

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

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

 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);