【发布时间】:2011-06-23 18:12:12
【问题描述】:
我对 C 语言相当陌生,在我的大部分研究中都不需要比 python 更快的东西。然而,事实证明,我最近所做的工作需要计算相当大的向量/矩阵,因此可能需要 C+MPI 解决方案。
从数学上讲,这个任务很简单。我有很多维数约为 40k 的向量,希望计算这些向量的选定对的 Kronecker Product,然后对这些 kronecker 乘积求和。
问题是,如何有效地做到这一点?下面的代码结构,使用for循环,或者获取效果有什么问题吗?
下面描述的函数kron 传递长度为vector_size 的向量A 和B,并计算它们的kronecker 乘积,并将其存储在C 中,即vector_size*vector_size 矩阵。
void kron(int *A, int *B, int *C, int vector_size) {
int i,j;
for(i = 0; i < vector_size; i++) {
for (j = 0; j < vector_size; j++) {
C[i*vector_size+j] = A[i] * B[j];
}
}
return;
}
这对我来说似乎很好,当然(如果我没有犯一些愚蠢的语法错误)会产生正确的结果,但我偷偷怀疑嵌入的 for 循环不是最佳的。如果还有其他方法我应该解决这个问题,请告诉我。欢迎提出建议。
感谢您的耐心和任何建议。再说一次,我对 C 语言非常缺乏经验,但谷歌搜索并没有给我带来这个查询的乐趣。
【问题讨论】:
-
两个向量的克罗内克积不是向量吗?
-
+1 提出了一个很好的问题。欢迎来到 SO。
-
Jens:谢谢 :-) Dan:一些库(scipy,我认为是 matlab)将通过将两个 N 维向量(实际上是它们的外积)转换为 N 获得的 N 乘 N 矩阵变平*N 维向量。得到矩阵形式还是向量形式我并不太在意,只要能求和就行了……
-
可能是一个小错字:正如所写,
C[i][j]不会编译。您将需要C[i*vector_size+j]之类的东西或将函数参数声明为int C[vector_size][](重新排列,使用 gcc)。 -
@Joseph:不是错字,而是更多证明我通常是 python“编码器”:P 感谢您的更正!
标签: c linear-algebra