我有三个矩阵,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(长度的B
和Index
,这会变得非常慢。有没有办法我可以避免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.