0

我将两个矩阵 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)

但它不起作用。它说尺寸不匹配。有人有什么建议吗?

4

1 回答 1

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,可用于使代码更清晰。但是,在尝试压缩性能时,它们通常没有用。即使调试了匿名函数/arrayfun 实现,我怀疑它也需要大致相同的内存使用量。cellfunfor

于 2013-07-15T23:21:50.263 回答