Matlab的cpp文件中的矩阵乘法

时间:2013-12-11 19:15:51

标签: c++ matlab matrix

如何以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:

发现错误,它与矩阵乘法循环无关。

2 个答案:

答案 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库,它们是开源的,并提供了一种简单的矩阵乘法方法。