设S是对称nxn矩阵,A是amxn矩阵.
给定:B = A*S*A_transpose(其中"*"表示矩阵乘积运算)
B也将是对称矩阵.
使用tuxfamily Eigen库,版本3,什么是实现此计算的干净有效的方法?(通过有效,我主要是指在对称性不必要的情况下,不执行B元素的重复计算.)
我猜它会使用SelfAdjointView,但我搜索了高低,没有找到一个干净的例子.
该应用程序是一个卡尔曼滤波器,它严重依赖于涉及(对称)协方差矩阵的运算,因此我希望确保实现/设计正确.
谢谢!
这是我的示例代码:
(请注意包围的部分#if ENABLE_MY_COMPILE_ERROR)
#include <Eigen/Core>
#include <iostream>
#define ENABLE_MY_COMPILE_ERROR 1
void f1(const Eigen::Ref<Eigen::MatrixXd> a,
const Eigen::Ref<Eigen::MatrixXd> b,
Eigen::Ref<Eigen::MatrixXd> c)
{
c = a * b;
}
int main(int argc, const char *argv[])
{
Eigen::Matrix3d M;
Eigen::Vector3d x;
Eigen::Vector3d y;
M.setRandom();
x.setRandom();
std::cout<<"M = \n"<<M<<std::endl;
std::cout<<"x = \n"<<x<<std::endl;
std::cout<<"M * x = \n"<<M * x<<std::endl;
{
y.setZero();
f1(M,x,y);
std::cout<<"y = \n"<<y<<std::endl;
}
{
Eigen::Matrix3d& MRef = M;
y.setZero();
f1(MRef,x,y);
std::cout<<"y = \n"<<y<<std::endl;
}
#if ENABLE_MY_COMPILE_ERROR
{
const Eigen::Matrix3d& MRef …Run Code Online (Sandbox Code Playgroud) 简而言之,我正在努力尝试将 a 中的图像每像素类别掩码tf.data.Dataset从整数类编码转换为单热编码。
考虑这里的图像分割 tensorflow 教程示例:https ://www.tensorflow.org/tutorials/images/segmentation 。
输入是图像,输出是按像素整数标记的类别掩码。在他们的示例中,掩码在每个像素处都有一个由整数表示的类别值:{0、1 或 2}。
的train和test的变量的类型的tf.data.Dataset ,并且每个样品是(图像,掩模)元组。
这种形式的掩码/输出与sparse_categorical_crossentropy教程中的损失函数是一致的。但是,我希望能够使用其他需要单热编码的损失函数。
我一直在尝试tf.keras.utils.to_categorical()使用 map() 调用通过函数转换数据集,即:
def mask_to_categorical(image, mask):
mask = tf.keras.utils.to_categorical(mask,3)
return image, mask
train = train.map(mask_to_categorical)
Run Code Online (Sandbox Code Playgroud)
但是,这失败并出现错误,例如:
{...}/tensorflow_core/python/keras/utils/np_utils.py:40 to_categorical
y = np.array(y, dtype='int')
TypeError: __array__() takes 1 positional argument but 2 were given
Run Code Online (Sandbox Code Playgroud)
笔记:
到目前为止,我的搜索指出急切/非急切问题是一个可能的原因。值得一提的是,我通过以下方式验证了我正在以 Eager 模式运行:
>>> print('tf.executing_eagerly() = ', tf.executing_eagerly())
tf.executing_eagerly() = True
Run Code Online (Sandbox Code Playgroud)
有什么建议?谢谢!