如何以cpp
格式进行矩阵乘法,将其编译成mex
文件?
我在Matlab脚本中的常规矩阵乘法如下:
cMatrix = (1 / r) * pfMatrix * wcMatrix; %here pfMatrix is 2x3 and wcMatrix is 3x8
% Hence cMatrix is 2x8
% r is a scalar
pfMatrix,wcMatrix和r在cpp
文件中正确声明,并且它们具有与脚本中相同的值。但是cMatrix没有给我相同的结果。这里是cpp
:
int i, n, j;
for (i = 0; i<1; i++)
{
for (n = 0; n<7; n++)
{
for (j = 0; j<2; j++)
{
d->cMatrix[i][n] += (d->pfMatrix[i][j]) * (d->wcMatrix[j][n]);
}
d->cMatrix[i][n] = (1 / d->r) * d->cMatrix[i][n];
}
}
修改
我在Ben Voigt回答之后修改了循环。 cMatrix
中的结果仍然与使用Matlab脚本计算的结果不同。
例如:
pfMatrix = [7937.91049469652,0,512;0,7933.81033431703,384];
wcMatrix = [-0.880633810389421,-1.04063381038942,-1.04063381038942,-0.880633810389421,-0.815633810389421,-1.10563381038942,-1.10563381038942,-0.815633810389421;-0.125,-0.125,0.125,0.125,-0.29,-0.29,0.29,0.29;100,100,100,100,100,100,100,100];
r = 100;
在这种情况下,cMatrix(1,1)
是:
(pfMatrix(1,1)*wcMatrix(1,1) + pfMatrix(1,2)*wcMatrix(2,1) + pfMatrix(1,3)*wcMatrix(3,1)) / r = 442.09
但是,对于mex
文件,等效结果为959
。
编辑#2:
我发现pfMatrix
元素中的错误未正确声明(错过2除以)。所以Ben Voigt的答案是正确的。但是,两个结果之间仍然存在细微差别(Matlab脚本给出442,而mex给出447,可能是不同数据类型的结果吗?)。
编辑#3:
发现错误,它与矩阵乘法循环无关。
答案 0 :(得分:2)
将结果矩阵用作临时空间不是一个好主意。编译器必须担心别名,这意味着它无法优化。
尝试一个明确的工作变量,它也提供了一个方便的零位置:
for (int i = 0; i < 2; ++i) {
for (int n = 0; n < 8; ++n) {
double accum = 0.0;
for (int j = 0; j < 3; ++j) {
accum += (d->pfMatrix[i][j]) * (d->wcMatrix[j][n]);
}
d->cMatrix[i][n] = accum / d->r;
}
}
你的范围也错了,我已经解决了。
(另请注意,大型矩阵的良好性能要求使用条带来获得良好的缓存行为,但这对于此大小的产品来说不应该是一个问题。)
答案 1 :(得分:0)
矩阵之间的乘法必须是这样的:A [m] [n] * B [n] [p] = R [m] [p]。
您在for循环中编写的条件不正确,并且不遵循矩阵维度。
另请参阅Eigen库,它们是开源的,并提供了一种简单的矩阵乘法方法。