2011-04-09 298 views

回答

8

免责声明两个矩阵:我没有用过AlgLib;我只是想通过文档似乎说。我很乐意被更多专家纠正。

无论如何,恐怕答案似乎是,你需要使用cmatrixgemmrmatrixgemm(哪一个取决于你的矩阵是否真实复杂的),像这样:

rmatrixgemm(m,n,k, 1, A,0,0,0, B,0,0,0, 0, C,0,0); 

其中:

  • mnk是(矩阵的大小是Am通过kBk通过nCm通过n
  • 1是什么乘以产品(如果你恰好想,说,3AB而不是AB,把3有代替)
  • A,0,0,0B,0,0,0群体:矩阵,行偏移量,列偏移量,操作类型
    • 操作类型为0,原样使用A或B,1使用转置,2使用共轭转置(当然,您不能使用2代表rmatrixgemm
  • 下一个0说0 * C添加到结果(如果你把0这里,那么在C被完全忽略的初始值)
  • 两个0年代后C的行和列偏移

你或许会认为这种普遍性是过度的,而且应该有一个更简单的函数来提供这些默认值。我不会不同意这一点,但据我所知,在AlgLib中没有这样简单的功能。你可能想写自己的(这只会叫rmatrixgemmcmatrixgemm)。 (为什么这么普遍?因为做一个有效的矩阵乘法需要非常复杂的代码,并且它基本上与您需要执行*matrixgemm所执行的更一般的C=a.f(A).g(B)+b.C操作相同的相当复杂的代码,并且有时更一般的操作是)

编辑添加一些可能有用的评论。

  • 偏移量是这样,你可以用子矩阵做事情。能够做到这一点在一些数值算法中很有用。我假设m,n,k是您使用的子矩阵的大小;在一般情况下,它们将与阵列的尺寸相同,并且偏移将为零。
  • 在您拨打rmatrixgemmcmatrixgemm之前,阵列本身需要存在并且尺寸适当。至少,AB当然可以; C作为ref传递,因此如果它的输入是null,这些函数可能会创建它。
  • 你可能会认为从rmatrixgemmcmatrixgemmABC通过引用传递被复制的签名,但如果我不完全困惑的C#语义他们都是有效的(对象)引用传递。
+3

哇......我没有办法通过阅读手册了解到这一点......谢谢 – Nestor 2011-04-09 21:16:23

+0

我希望事实证明它实际上可以工作:-)。 – 2011-04-09 21:41:16

+0

对于不太一般,更简单的函数,始终可以创建一个函数,该函数在内部使用带有硬编码伪参数的“rmatrixgemm”。 – heltonbiker 2013-02-18 13:23:01

3

只是为了确认哪些Garech写道:

double[,] a = new double[,] { 
    {1,2,3}, 
    {4,5,6} 
}; 
double[,] b = new double[,] { 
    {7,8,9,10}, 
    {11,12,13,14}, 
    {15,16,17,18} 
}; 
int m = a.GetLength(0); 
int n = b.GetLength(1); 
int k = a.GetLength(1); 
double[,] c = new double[m,n]; 
alglib.rmatrixgemm(m, n, k, 1, a, 0,0,0, b,0,0,0, 0, ref c, 0,0); 
//c = {{74, 80, 86, 92}, {173, 188, 203, 218}} 
0

在VBA我能够使用此功能的复杂的版本。

Alpha.x = 1: Alpha.y = 0 
Beta.x = 0: Beta.y = 0 

Call CMatrixGEMM(4, 1, 4, Alpha, r, 0, 0, 0, x, 0, 0, 0, Beta, RX, 0, 0) 

作为附带说明的alglib功能整个集合可以通过加载所有alglib模块到一个访问数据库中,然后从当前数据库其中函数设定到该数据库的引用被加载到任何接入方案是必要的。这使得它对工作数据库非常方便和轻便。

+0

这个库也可用于vb6这里:http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=74940&lngWId=1 – Testautomation 2013-10-21 13:50:31