scilab - 如何从带有 if 语句的函数中 return 矩阵?
scilab - how to return matrices from a function with if-statements?
我有一个看起来像这样的 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
return 不是像 S
和 A
这样的值矩阵?我如何实现它将 return "Bigger. Lower. Lower. Lower." 作为答案?即我想对矩阵的每个元素进行运算
因为在你的程序中你写了 Q = "Bigger"
和 Q = "Lower"
。这意味着 Q
将只有一个值。如果您想存储 A
和 S
中每个值的比较,您必须让 Scilab 这样做。
您可以使用循环实现此类行为。这是通过使用两个 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-by-n 或 n-by-1 矩阵),矩形矩阵(m-by-n 矩阵,m ≠ n ),它有不同的行为,或方阵(n-by-n矩阵):
- 向量:它的工作方式类似于
.^
,即它单独提升每个元素 (see Scilab help)。
- 矩形:它不起作用,因为它必须遵循 matrix multiplication 的规则。
- 平方:有效并遵循矩阵乘法规则。
我要补充一点,在 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
我有一个看起来像这样的 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
return 不是像 S
和 A
这样的值矩阵?我如何实现它将 return "Bigger. Lower. Lower. Lower." 作为答案?即我想对矩阵的每个元素进行运算
因为在你的程序中你写了 Q = "Bigger"
和 Q = "Lower"
。这意味着 Q
将只有一个值。如果您想存储 A
和 S
中每个值的比较,您必须让 Scilab 这样做。
您可以使用循环实现此类行为。这是通过使用两个 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-by-n 或 n-by-1 矩阵),矩形矩阵(m-by-n 矩阵,m ≠ n ),它有不同的行为,或方阵(n-by-n矩阵):
- 向量:它的工作方式类似于
.^
,即它单独提升每个元素 (see Scilab help)。 - 矩形:它不起作用,因为它必须遵循 matrix multiplication 的规则。
- 平方:有效并遵循矩阵乘法规则。
我要补充一点,在 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