如何在matlab中的arrayfun中传递一个数组作为参数?

时间:2013-07-15 22:37:59

标签: matlab vectorization

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

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

1 个答案:

答案 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

工具arrayfuncellfun对功能化for循环非常有用,可用于使代码更清晰。但是,在尝试挤压性能时,它们通常不常用。即使调试了匿名函数/ arrayfun实现,我怀疑它需要大致相同的内存使用量。