减少内存矩阵乘法

7视图(30天)
将核技术
将核技术 2018年10月22日
评论道: 布鲁诺陈德良 2018年10月24日
嗨,帅哥,我有两个向量乘以1 e4 * 1 e4矩阵如下例子:
一个= 1:1:10000;
B =兰德(10000);
C = (1:1:10000)”;
我有一个结果矩阵像D一样,每个数组是通过这些矩阵的乘法如下:
D(每个数组)= * (B * C);
D矩阵的大小是11 * 11或更大,这意味着我应该做这个乘法运算121次或更多消费大内存和时间。知道如何优化增殖过程吗?
19日的评论
詹姆斯Tursa
詹姆斯Tursa 2018年10月22日
编辑:詹姆斯Tursa 2018年10月22日
所以,你会,你的伪代码是这样的:
一个= 0(11日11);D =;
F =一些大型循环矩阵(固定值)
k1 =一些整数(固定值循环)
k2 =一些整数(固定值循环)
q = 1:200
p = 1:1:121
A =兰德(10000);%计算,每一次变化
B = F (k1 + 1: k1 + 10000, k2 + 1: k2 + 10000);
C =兰德(10000 1);%计算,每一次变化
D (p) = * (B * C);
结束
= D +;
结束
即。B显然可以退出循环在上面的代码和数据复制只做一次。它知道哪些事情是至关重要的改变在循环,哪些事情没有。
我们可以帮你与C墨西哥人的东西,但前提是真的很有道理,我们才知道我们知道伪代码看起来如何。

登录置评。

答案(2)

马特·J
马特·J 2018年10月22日
编辑:马特·J 2018年10月22日
一种可能性是在A和C,嵌入在大型稀疏向量乘以F .这样你不必把B从F和分配单独的内存。
咱= spalloc(1、大小(F, 1), 1 e4);
佐= spalloc(大小(F, 2), 1, 1 e4);
p = 1:121
一个=
Apad =咱;
Apad (e4 k1 + 1: k1 + 1) =一个;
C =
Cpad =佐;
Cpad (k2 + 1: k2 + 1 e4) = C;
D (p) = Apad * * Cpad (F);
结束
9日评论
布鲁诺陈德良
布鲁诺陈德良 2018年10月23日
结果与我的电脑代码
全部:运行时间是0.278291秒。
稀疏:运行时间是0.360029秒。
当然你可以尝试增加N的限制成为有利越来越稀疏。

登录置评。


布鲁诺陈德良
布鲁诺陈德良 2018年10月22日
编辑:布鲁诺陈德良 2018年10月24日
如果您使用的是R2018a / b可以使用墨西哥人附加文件来避免形成b矩阵向量产品被一个循环向量x向量,它可以低于MATLAB(根据我的两次测试)。
[m, n] =大小(F);
AFk = 0(1、大小(C, 1));
k = 1:长度(哪些)
颗= mxCreateSharedMatrix2018 (F, k1 + (k2 + k - 1) * m,大小(A, 2), 1);
AFk (k) = A *颗;
结束
mxUnshareMatrix2018(颗,[],1);
清晰的
D = AFk * C;%或一组D (k1, k2) ?

类别

找到更多的在性能和内存帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!