【问题标题】:Optimize for loop in Matlab在 Matlab 中优化 for 循环
【发布时间】:2021-07-17 08:00:12
【问题描述】:

我有三个矩阵,A 是 2 x 3,B 是 2 x 5,Index 是 3 x 5。

A = [1,3,5;2,4,6];
B = [5,3,3,5,3;6,4,4,6,4];
Index = logical([0,0,0,0,1;0,1,1,0,0;1,0,0,1,0]);

我正在尝试查看 B 中的每个列向量是否与索引找到的 A 中的正确列向量匹配。我的代码如下。

error = 0;
for i = 1:size(B,2)
    if A(:,Index(:,i)) ~= B(:,i)
        error = error + 1;
    end
end

error 在此循环结束时将为 1,因为 B 中的最后一列应该是 [1;2]。我的问题是BIndex 的长度非常大(10^6),这变得非常慢。有没有办法可以避免 for 循环或者我注定要失败?

【问题讨论】:

    标签: matlab for-loop optimization


    【解决方案1】:

    你可以先用A*Index构造索引矩阵,然后直接测试这两个矩阵:

    >> error = sum(max(A*Index ~= B))
    
    error =
    
         1
    

    详情

    分解,A*Index 生成索引矩阵:

    >> A*Index
    
    ans =
    
         5     3     3     5     1
         6     4     4     6     2
    

    然后可以直接与B比较:

    >> A*Index ~= B
    
    ans =
    
      2×5 logical array
    
       0   0   0   0   1
       0   0   0   0   1
    

    时间

    R2021a Online 拥有 1000 万个索引,在约 1 秒内运行矢量化版本,而循环运行约 100 秒:

    >> B = repmat(B, 1, 1e7);
    >> Index = repmat(Index, 1, 1e7);
    
    >> tic
       error = sum(max(A*Index ~= B));
       toc
    
    Elapsed time is 0.952846 seconds.
    
    >> tic
       error = 0
       for i = 1:size(B,2)
           if A(:,Index(:,i)) ~= B(:,i)
               error = error + 1;
           end               
       end                           
       toc
    
    Elapsed time is 98.666943 seconds.
    

    【讨论】:

    • 您使用的是哪个版本的 MATLAB?索引中有双重间接,但我仍然很惊讶它需要这么长时间才能运行。矢量化解决方案使用更多内存,因此可能会比较慢。
    • @CrisLuengo 我正在使用 R2021a Online。昨晚我的反应迟缓/崩溃了很多,所以我想是出了点问题。我刚才又试了一次,这两个方面都更快。
    猜你喜欢
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 2015-01-13
    • 1970-01-01
    相关资源
    最近更新 更多