gpt4 book ai didi

c++ - Matlab 的 cpp 文件中的矩阵乘法

转载 作者:行者123 更新时间:2023-11-30 04:10:41 26 4
gpt4 key购买 nike

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

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

最佳答案

将结果矩阵用作暂存空间并不是一个好主意。编译器必须担心别名,这意味着它无法优化。

尝试一个明确的工作变量,它也提供了一个方便的地方来将它归零:

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;
}
}

你的范围也有误,我已经修正了。

(另请注意,大型矩阵的良好性能需要 strip 化才能获得良好的缓存行为,但是对于这种大小的产品,这不应该成为问题。)

关于c++ - Matlab 的 cpp 文件中的矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20528005/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com