我将两个矩阵A(大小为nxn)和B(大小为nxm)相乘。 matlab中最简单的方法是
n = 1000;
m = 500;
for k=1:n
A(k, :) = (1:n)+k;
end
B = rand(n, m);
C = A*B; % C of the size nxm
但是,当n和/或m太大时,此代码占用的内存太多。所以我正在寻找一个矢量化版本的数组来实现
n = 1000;
m = 500;
B = rand(n, m);
func0 = @(k, colv) [(1:n)+k]*colv;
func1 = @(V) arrayfun(func0, 1:n, V);
func1(B)
但它不起作用。它说维度不匹配。有人有什么建议吗?
答案 0 :(得分:1)
我不会使用任何花哨的东西,只需要分解正在执行的线性代数。
C = zeros(n,m);
for k = 1:n
C(k,:) = ((1:n)+k) * B;
end
或者,稍微更详细一点
C = zeros(n,m);
for k = 1:n
A_singleRow = ((1:n)+k);
C(k,:) = A_singleRow* B;
end
对于疯狂的大尺寸(听起来像你有),尝试重新设计问题,以便您可以迭代列而不是行。 (Matlab使用列主要矩阵存储,这意味着同一列中的元素在内存中相邻。通常对此有所影响可能属于过度优化的范畴,但可能不适合您。)
例如,您可以按如下方式构建Ctranspose
:
Ctranspose = zeros(m,n); %Note reversed order of n, m
Btranspose = B'; %Of course you may want to just create Btranspose first
for k = 1:n
A_singleRowAsColumn = ((1:n)'+k);
Ctranspose(:,k) = Btranspose * A_singleRowAsColumn;
end
工具arrayfun
,cellfun
对功能化for
循环非常有用,可用于使代码更清晰。但是,在尝试挤压性能时,它们通常不常用。即使调试了匿名函数/ arrayfun实现,我怀疑它需要大致相同的内存使用量。