假设我的矩阵A是比较函数的输出,即逻辑矩阵仅具有值0和1。对于大小为3 * 4的小矩阵,我们可能会有类似的内容:
A =
1 1 0 0
0 0 1 0
0 0 1 1
现在,我正在生成另一个矩阵B,该矩阵的大小与A相同,但是矩阵的行中填充了索引A,并且每行中的剩余值都设置为零。
B =
1 2 0 0
3 0 0 0
3 4 0 0
当前,我在A的每一行上使用find函数来获取矩阵B。完整的代码可以写为:
A=[1,1,0,0;0,0,1,0;0,0,1,1];
[rows,columns]=size(A);
B=zeros(rows,columns);
for i=1:rows
currRow=find(A(i,:));
B(i,1:length(currRow))=currRow;
end
对于大型martix,根据Matlab Profiler,“查找”功能需要花费时间。有什么方法可以更快地生成矩阵B吗?
注意:矩阵A每行有1000列以上,但非零元素永远不会超过50列。在这里,我将矩阵B设为与A相同的大小,但矩阵B的列大小可以小得多。
我建议使用parfor
,但是这里的开销太大,并且还有更多问题,所以它不是一个好的解决方案。
rows = 5e5;
cols = 1000;
A = rand(rows, cols) < 0.050;
I = uint16(1:cols);
B = zeros(size(A), 'uint16');
% [r,c] = find(A);
tic
for i=1:rows
% currRow = find(A(i,:));
currRow = I(A(i,:));
B(i,1:length(currRow)) = currRow;
end
toc
@Cris建议用find
索引操作代替。它将性能提高约10%。
显然,没有更好的优化方法,除非B
要求您采用特定的形式。我建议使用[r,c] = find(A);
是否不需要矩阵形式的索引。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句