我有一个符号表达式向量和一个点向量。然后我想获得一个向量,其中第一个元素是第一个点评估的第一个符号函数,第二个 - 第二个函数在第二个点等等。我可以用'for'循环这样做
>> syms x
>> f=formula([x, x^2, x^3]);
>> a=[1, 2, 3];
>> ans=zeros(1,3);
>> for i=1:3
z(x)=f(i);
ans(i)=z(a(i));
end
>> ans
ans =
1 4 27
但有没有办法避免循环?某种元素评估?
提前致谢!
答案 0 :(得分:0)
首先,让我们避免使用符号数学工具箱。这是不必要的。尝试制作formula
接受矢量化输入。如果我理解了您的问题,一般情况下您希望采用矩阵,第一列适用x
,第二列适用x^2
,第三列适用{{} 1}}。换句话说,这样做:
x^3
这称为anonymous function。简单地说,它将返回存储在f = @(x) [x(:,1), x(:,2).^2, x(:,3).^3];
中的函数,该函数将执行我们上面刚才描述的操作。这个函数将做的是它将采用矩阵的第一列,并输出f
。矩阵的第二列将输出这些值但平方,矩阵的最后一列将输出这些值但是立方。现在,提供一个矩阵,其中每个行对应于您要为x
中的每个元素评估的值。
示例:
f
现在,只需使用A = [1 2 3; 4 5 6; 7 8 9]
A =
1 2 3
4 5 6
7 8 9
作为A
的输入。
f
第一行评估result = f(A)
result =
1 4 27
4 25 216
7 64 729
处的公式,下一行评估您的公式[1,2,3]
,依此类推。
您的示例仅为一行提供此内容,但此处的代码推广为[4,5,6]
矩阵。
这仅适用于矩阵有3列的情况。如果你尝试做更多的事情,你会得到一个索引越界错误...这是有道理的,因为你的公式一次只定义了三个输入。
答案 1 :(得分:0)
这是对您的问题的补充答案,假设我们必须使用符号数学工具箱。首先,正常创建公式:
syms x
f = formula([x, x^2, x^3);
然后,您可以使用subs
将x
的值替换为您想要的值。 subs
的语法如下:
out = subs(f, val);
val
可以是您希望替换公式中的变量的值的单个值,向量或矩阵。如果要使用矢量,请将其指定为列矢量,这一点非常重要。你以后会明白为什么。
这背后的关键是,对于要用于替换的x
的每个值,它将用x
替换整个公式。换句话说,如果您执行out = subs(f, [1;2;3]);
,则会输出一个矩阵,其中第一行包含x=1
,下一行包含x=2
,最后一行包含x=3
}。如果您执行了out = subs(f,[1 2 3]);
,则会为您提供9 x 1
向量,其中三个中的每个三个都是该特定x
值的输出。
这并不是您想要的,但是当您将输入指定为列向量作为输出时,您可以简单地选择沿对角线的所有元素,因为这样将向量中元素的i'th
条目与i'th
公式对应。
换句话说:
A = (1:3).';
out = subs(f, A)
out =
[ 1, 1, 1]
[ 2, 4, 8]
[ 3, 9, 27]
finalOut = diag(out)
finalOut =
1
4
27
这是我在不使用for
循环的情况下看到这一点的唯一方法。请记住,这仅适用于单个矢量。如果您想要实际的double
值,而不是将其表示为sym
,则您需要使用double()
转换输出。