【问题标题】:Quick (sparse) matrix generation in matlabmatlab中的快速(稀疏)矩阵生成
【发布时间】:2013-11-20 19:26:31
【问题描述】:

我正在使用基于函数f 的一些值填充稀疏矩阵,使用嵌套的 for 循环,如下所示:

B = sparse(x, y);
for ix=1:x
    for jy=1:y
        if f(ix,jy)
              B(ix, jy) = 1;
        end
    end
end

这是在matlab中做事最好最快的方法,还是有优化的方法?

【问题讨论】:

  • f 是什么?函数还是矩阵?
  • 一个函数,抱歉没说清楚。
  • 你的函数可以接受向量输入并输出相同长度的向量吗?

标签: matlab matrix sparse-matrix


【解决方案1】:

您可以尝试以下方法,以避免循环:

[is, js] = ind2sub(size(B), 1:numel(B));
fval = arrayfun(f, is, js);
B(find(fval)) = 1;

不确定是否会更快。

如果f 接受向量而不是单个索引,您可以跳过arrayfun

【讨论】:

  • 你知道我如何确定哪个更快吗?
  • 你为什么不试试看?
【解决方案2】:

如果您的函数可以接受向量输入,您可以一次性计算出f 的所有值,然后使用sparse

[II,JJ] = ndgrid(1:y,1:x);
F = reshape(f(II(:),JJ(:)),x,y); % maybe just f(II,JJ) if f allows it
[ii,jj] = find(F);
B = sparse(ii,jj,1,x,y);

如果您的函数不采用向量,则必须通过循环运行它或使用arrayfun 生成F(ix,iy) = f(ix,iy);,然后使用findsparse 如上所述。

【讨论】:

  • 如果没有函数f,这有点难以确定,特别是因为x 是行,y 是问题中的列。可能需要对索引进行一些摆弄,但重点是在计算 F 后使用 sparse...
猜你喜欢
  • 2017-12-05
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
相关资源
最近更新 更多