Added operator* that allows A*x for sparse A and x an AD object.

This commit is contained in:
Atgeirr Flø Rasmussen 2013-05-01 09:05:53 +02:00
parent 92f56f6d92
commit f85e74bcff
2 changed files with 22 additions and 2 deletions

View File

@ -194,6 +194,20 @@ namespace AutoDiff
return fw.print(os);
}
/// Multiply with sparse matrix from the left.
template <typename Scalar>
ForwardBlock<Scalar> operator*(const typename ForwardBlock<Scalar>::M& lhs,
const ForwardBlock<Scalar>& rhs)
{
int num_blocks = rhs.numBlocks();
std::vector<typename ForwardBlock<Scalar>::M> jac(num_blocks);
assert(lhs.cols() == num_blocks);
for (int block = 0; block < num_blocks; ++block) {
jac[block] = lhs*rhs.derivative()[block];
}
typename ForwardBlock<Scalar>::V val = lhs*rhs.value().matrix();
return ForwardBlock<Scalar>::function(val, jac);
}
} // namespace Autodiff

View File

@ -30,14 +30,14 @@ int main()
ADV::V v2(3);
v2 << 1.0, 2.2, 3.4;
enum { FirstVar = 0, SecondVar = 1, ThirdVar = 2 };
ADV a = ADV::constant(FirstVar, v1, blocksizes);
ADV a = ADV::constant(v1, blocksizes);
ADV x = ADV::variable(FirstVar, v2, blocksizes);
std::vector<ADV::M> jacs(num_blocks);
for (int i = 0; i < num_blocks; ++i) {
jacs[i] = ADV::M(blocksizes[FirstVar], blocksizes[i]);
jacs[i].insert(0,0) = -1.0;
}
ADV f = ADV::function(FirstVar, v2, jacs);
ADV f = ADV::function(v2, jacs);
ADV xpx = x + x;
std::cout << xpx;
@ -54,4 +54,10 @@ int main()
ADV sqxdx = sqx / x;
std::cout << sqxdx;
ADV::M m(2,3);
m.insert(0,0) = 4;
m.insert(0,1) = 3;
m.insert(1,1) = 1;
std::cout << m*sqx;
}