我目前正在尝试使用 Microsoft SEAL 库实现矩阵乘法方法。我创建了一个 vector<vector<double>>
作为输入矩阵并用 CKKSEncoder
编码.然而,编码器将整个 vector 打包成一个 Plaintext
所以我只有一个vector<Plaintext>
这让我失去了 2D 结构(然后我当然会在加密后得到一个 vector<Ciphertext>
)。拥有一维 vector 后,我只能完全访问行,而不能访问列。
我设法在编码前转置矩阵。这允许我按分量乘以第一个矩阵的行和第二个矩阵的列(转置形式的行),但我无法将结果 vector 的元素加在一起,因为它被打包到一个密文中。我只需要弄清楚如何使 vector 点积在 SEAL 中工作以执行矩阵乘法。我是否遗漏了什么或者我的方法有误?
最佳答案
KyoohyungHan 在问题中建议:https://github.com/microsoft/SEAL/issues/138可以通过旋转输出 vector 并反复求和来解决旋转问题。
例如:
// my_output_vector is the Ciphertext output
vector<Ciphertext> rotations_output(my_output_vector.size());
for(int steps = 0; steps < my_output_vector.size(); steps++)
{
evaluator.rotate_vector(my_output_vector, steps, galois_keys, rotations_output[steps]);
}
Ciphertext sum_output;
evaluator.add_many(rotations_output, sum_output);
关于c++ - 带有 CKKS 的 Microsoft SEAL 中的 vector 点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60203625/