【发布时间】:2020-01-01 15:03:38
【问题描述】:
假设我的矩阵 A 是比较函数的输出,即只有值 0 和 1 的逻辑矩阵。对于一个大小为 3*4 的小矩阵,我们可能有这样的东西:
A =
1 1 0 0
0 0 1 0
0 0 1 1
现在,我正在生成另一个与 A 大小相同的矩阵 B,但它的行填充了 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
对于大型矩阵,根据 Matlab Profiler,“查找”功能在计算中需要时间。有什么方法可以更快地生成矩阵 B 吗?
注意: 矩阵 A 每行有超过 1000 列,但非零元素永远不会超过 50。在这里,我将矩阵 B 与 A 的大小相同,但矩阵 B 的列大小可以小得多。
【问题讨论】:
-
您可以将
find替换为索引操作,但如果这样更快,我会感到惊讶。I = 1:columns; currRow = I(A(i,:)); -
我一直在考虑可以完全删除“for”循环以加快操作。这可能吗?
-
您是否考虑将矩阵存储为
sparse矩阵?我还将存储矩阵的转置,以便沿列进行搜索,就像它们在 MATLAB 中存储的方式一样。 -
forMatlab 中的循环不一定很慢。从历史上看,它们是,但现在情况并非如此。根据 Cris 和 beaker 的建议,我不希望矢量化版本更快。
标签: matlab