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). - Прямоугольник: он не будет работать, потому что он должен следовать правилу умножения матриц.
- Квадрат: это работает и следует правилу умножения матриц.