首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候不向量化matlab?

什么时候不向量化matlab?
EN

Stack Overflow用户
提问于 2009-11-22 09:13:36
回答 4查看 688关注 0票数 6

我正在编写一些matlab代码,它正在处理大型(但不是大型)数据集: 10,000,784个元素向量(不是稀疏的),并计算存储在10,000x10稀疏矩阵中的相关信息。为了让代码正常工作,我迭代地做了一些更棘手的部分,对10k项进行循环以处理它们,并对稀疏矩阵中的10项进行一些循环以进行清理。

我的过程最初花了73次迭代(因此,大约730k循环)来处理,大约在120秒内运行。不坏,但这是matlab,所以我开始向量化它,以提高它的速度。

最后,我得到了一个完全矢量化的解决方案,它得到了相同的答案(所以它是正确的,或者至少和我最初的解决方案一样正确),但运行起来需要274秒,几乎快了一半!

这是我第一次遇到matlab代码,它的矢量化运行速度比迭代慢。是否有任何经验法则或最佳实践来确定何时可能/可能?

我很想分享代码以获得一些反馈,但这是一个目前开放的学校作业,所以我现在真的不能。如果它最终成为“哇,这太奇怪了,你可能做错了什么事”,我可能会在一两周内重新访问它,看看我的矢量化是否以某种方式关闭。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-22 09:51:23

向量化通常意味着分配更多的内存(创建一个更大的数组来避免循环,例如通过tony's trick)。在最近的版本中改进了循环的JIT编译-有可能你的矢量化解决方案所需的内存分配意味着没有优势,但如果看不到代码,就很难说了。Matlab有一个出色的逐行剖析器,它可以帮助您查看矢量化版本的哪些特定部分正在花费时间。

票数 10
EN

Stack Overflow用户

发布于 2009-11-22 09:35:12

您是否尝试过将执行时间绘制为问题大小的函数(当前每个向量的元素数量为784,或当前向量的数量为10,000)?在向量化Gram-Schmidt正交化算法时,我遇到了类似的异常;事实证明,矢量化版本更快,直到问题增长到一定大小,在这一点上,迭代版本实际上运行得更快,如下图所示:

以下是两个实现和基准测试脚本:

clgs.m

代码语言:javascript
复制
function [Q,R] = clgs(A)
% QR factorization by unvectorized classical Gram-Schmidt orthogonalization

[m,n] = size(A);

R = zeros(n,n);     % pre-allocate upper-triangular matrix

% iterate over columns
for j = 1:n
    v = A(:,j);

    % iterate over remaining columns
    for i = 1:j-1
        R(i,j) = A(:,i)' * A(:,j);
        v = v - R(i,j) * A(:,i);
    end

    R(j,j) = norm(v);
    A(:,j) = v / norm(v);   % normalize
end
Q = A;

clgs2.m

代码语言:javascript
复制
function [Q,R] = clgs2(A)
% QR factorization by classical Gram-Schmidt orthogonalization with a
% vectorized inner loop

[m,n] = size(A);
R = zeros(n,n);     % pre-allocate upper-triangular matrix

for k=1:n
    R(1:k-1,k) = A(:,1:k-1)' * A(:,k);
    A(:,k) = A(:,k) - A(:,1:k-1) * R(1:k-1,k);
    R(k,k) = norm(A(:,k));
    A(:,k) = A(:,k) / R(k,k);
end

Q = A;

benchgs.m

代码语言:javascript
复制
n = [300,350,400,450,500];

clgs_time=zeros(length(n),1);
clgs2_time=clgs_time;

for i = 1:length(n)
    A = rand(n(i));
    tic;
    [Q,R] = clgs(A);
    clgs_time(i) = toc;

    tic;
    [Q,R] = clgs2(A);
    clgs2_time(i) = toc;
end

semilogy(n,clgs_time,'b',n,clgs2_time,'r')
xlabel 'n', ylabel 'Time [seconds]'
legend('unvectorized CGS','vectorized CGS')
票数 9
EN

Stack Overflow用户

发布于 2009-11-23 16:03:44

更一般地回答“何时不对MATLAB代码进行矢量化”的问题:

如果向量化不是直接的,并且使代码很难阅读,那么不要向量化代码。这是在以下假设下进行的

  1. 比你可能需要阅读和理解它的其他人。
  2. 未矢量化的代码足够快,可以满足您的需求。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1777425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档