如何解决为什么cumsum不能与符号向量一起使用?
我在符号向量上编写了一个包含cumsum
的小Octave脚本,我希望它能起作用,但不幸的是,它没有。
这是代码:
pkg load symbolic
n = 3;
syms q x
q = sym('q',[n 1]);
x = sym('x',[n 1]);
cumsum(q - x)
我得到的不是预期的结果:
错误:cumsum:类型参数'class'错误
为什么会这样?它可以与Matlab Symbolic Toolbox一起使用吗? (不幸的是,我没有它,所以我无法测试。)
解决方法
那是因为错误消息所指示的符号元素不支持用Octave编写的cumsum
。您的代码在MATLAB中提供了以下内容:
ans =
q1 - x1
q1 + q2 - x1 - x2
q1 + q2 + q3 - x1 - x2 - x3
您可以执行以下操作:
t1 = q-x;
t2 = triu(ones(numel(t1)));
sum(repmat(t1,1,3).*t2).'
% repmat is necessary here because implicit expansion is also not
% supported for matrices of class sym in Octave
Octave和MATLAB中的上述代码分别给出以下内容:
ans = (sym 3×1 matrix)
⎡ q₁₁ - x₁₁ ⎤
⎢ ⎥
⎢ q₁₁ + q₂₁ - x₁₁ - x₂₁ ⎥
⎢ ⎥
⎣q₁₁ + q₂₁ + q₃₁ - x₁₁ - x₂₁ - x₃₁⎦
ans =
q1 - x1
q1 + q2 - x1 - x2
q1 + q2 + q3 - x1 - x2 - x3
,
冒着明显的风险,可以将其作为for循环使用。
这是一个实现。
function Y = cumsum( X,N )
if nargin < 2,N = 1; end
YDims = size( X ); NDim = YDims(N); Y = sym( zeros( YDims ) );
XIdx = substruct( '()',repmat( {':'},ndims( X ) ) );
YIdx = substruct( '()',ndims( Y ) ) );
for i = 1 : NDim
XIdx.subs{N} = 1 : i;
YIdx.subs{N} = i;
Y = subsasgn( Y,YIdx,sum( subsref( X,XIdx ),N )
);
end
end
将此文件复制为cumsum.m到符号安装文件夹 1 中,以上脚本将与在matlab中一样工作。
1 :(在我的情况下,这是~/.octave/symbolic-2.9.0/@sym/cumsum.m,因为我已将pkg前缀设置为〜/ .octave)>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。