如何在不使用matlab中find的情况下得到逻辑矩阵的索引?

如何在不使用matlab中find的情况下得到逻辑矩阵的索引?,matlab,Matlab,让我们假设我的矩阵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

让我们假设我的矩阵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
对于大型火星,“查找”函数在根据Matlab Profiler进行计算时需要花费时间。有没有办法更快地生成矩阵B

注:
矩阵A每行有1000多列,但非零元素从不超过50。在这里,我将矩阵B视为与A相同的大小,但矩阵B的列大小可以小得多。

我建议使用
parfor
,但这里的开销太大,并且有更多的问题,因此这不是一个好的解决方案

行=5e5;
cols=1000;
A=兰特(行,列)<0.050;
I=uint16(1:cols);
B=零(尺寸(A),‘uint16’;
%[r,c]=找到(A);
抽搐
对于i=1:行
%currRow=find(A(i,:);
currRow=I(A(I,:);
B(i,1:长度(currRow))=currRow;
结束
toc
@Cris建议用索引操作替换
find
。它将性能提高约10%


显然,没有更好的优化,除非
B
必须是您所说的特定形式。我建议使用
[r,c]=find(A)
如果矩阵形式中不需要索引。

您可以用索引操作替换
find
,但如果这样更快,我会感到惊讶<代码>I=1:列;currRow=I(A(I,:)我一直在想,为了更快的运行,可以完全删除“for”循环。这可能吗?您是否考虑过将矩阵存储为矩阵?我还将存储矩阵的转置,以便沿着列进行搜索,就像它们在MATLAB中存储的方式一样。
for
循环在MATLAB中并不一定慢。历史上是这样,但现在不是这样。根据Cris和Biker的建议,我不希望矢量化版本更快。我当时的想法是,为了更快的操作,可以完全删除“for”循环。这可能吗?不,你需要对每一行都有不同的对待。类似于
I=repmat(uint16(1:cols),行,1);B=I(A)给出一个输出,但它不告诉每个结果属于哪一行。