scilab - как вернуть матрицы из функции с помощью if-операторов?

У меня есть функция scilab, которая выглядит примерно так (очень упрощенный код, чтобы понять, как это работает):

function [A, S, Q]=myfunc(a)
  A = a^2;

  S = a+a+a;    

  if S > A then
    Q = "Bigger";
  else 
    Q = "Lower";
  end
endfunction

И я получаю ожидаемый результат, если я бегу:

--> [A,S,Q]=myfunc(2)
 Q  = 

 Bigger

 S  = 

   6.

 A  = 

   4.

Но если положить в функцию матрицы, я ожидаю получить эквивалентные матрицы в качестве ответа с результатом, но вместо этого я получил это:

--> [A,S,Q]=myfunc([2 4 6 8])
 Q  = 

 Lower

 S  = 

   6.   12.   18.   24.

 A  = 

   4.   16.   36.   64.

Почему нет Q возвращая матрицы значений, таких как S а также A? И как мне добиться, чтобы он возвращал: "Больше. Ниже. Ниже. Ниже". как ответ?

2 ответа

Решение

Я добавлю, что в Scilab, чем меньше число циклов, тем лучше: поэтому ответ @luispauloml может быть переписан на

function [A, S, Q]=myfunc(a)
    A = a.^2; // used element wise power, see luispauloml advice
    S = a+a+a;
    Q(S > A) = "Bigger"
    Q(S <= A) = "Lower"
    Q = matrix(Q,size(a,1),size(a,2)) // a-like shape
endfunction

Потому что в вашей программе вы написали Q = "Bigger" а также Q = "Lower", Это означает, что Q будет иметь только одно значение. Если вы хотите сохранить сравнения для каждого значения в A а также S, ты должен заставить Скилаб сделать это.

Вы можете достичь такого поведения с помощью циклов. Вот как вы можете сделать это, используя два for петли:

function [A, S, Q]=myfunc(a)
    A = a^2;
    S = a+a+a;

    //Get the size of input a
    [nrows, ncols] = size(a)

    //Traverse all rows of the input
    for i = 1 : nrows 

        //Traverse all columns of the input
        for j = 1 : ncols 

            //Compare each element
            if S(i,j) > A(i,j) then

                //Store each result
                Q(i,j) = "Bigger"

            else
                Q(i,j) = "Lower"
            end
        end
    end
endfunction

Остерегаться A = a^2 , Это может нарушить вашу функцию. Он имеет другое поведение, если ввод a является вектором (матрица 1 на n или n на 1), прямоугольной матрицей (матрица m на n, m n) или квадратной матрицей (матрица n на n):

  • Вектор: работает как .^ т.е. он поднимает каждый элемент в отдельности ( см. справку Scilab).
  • Прямоугольник: он не будет работать, потому что он должен следовать правилу умножения матриц.
  • Квадрат: это работает и следует правилу умножения матриц.
Другие вопросы по тегам