在Matlab中对循环进行优化



我有三个矩阵,A是2乘3,B是2乘5,Index是3乘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]。我的问题是,对于非常大(10^6(长度的BIndex,这会变得非常慢。有没有办法我可以避免for循环,或者我注定要失败?

您可以使用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.

相关内容

  • 没有找到相关文章

最新更新