寻找一种在Matlab中向量化find命令的方法

时间:2019-02-22 09:30:50

标签: matlab find vectorization

我正在寻找一种更快的方式来使用find命令而不使用循环,到目前为止我发现的任何内容都对我没有帮助。这是我正在尝试做的一个简化示例:

A = [0.1,0.8,1;
     0.3,0.7,1;
     0.2,0.3,1]; % this is a square matrix with cumulated sums of probabilities in its rows
row_sel = [2,3,2]; % this is a vector containing the rows of A that I am interested in
index = NaN(length(A),1);
for i = 1:length(A)
    index(i) = find(A(row_sel(i),:)>rand,1,'first'); % I want to get the index of the first column of row row_sel(i) whose element exceeds a random number
end

不幸的是,类似

index_mat = find(A(row_sel,:)>rand(length(A),1),1,'first')

不能解决问题。感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

单线:

size(A, 2) + 1 - sum(A(row_sel, :) > rand(size(A, 1), 1), 2)

说明

您已经知道了

A(row_sel, :) > rand(size(A, 1), 1)

为您提供所需的值与一些随机数之间的比较。假设这是

ans =
    0  1  1
    0  0  1
    0  1  1

然后

sum(A(row_sel, :) > rand(size(A, 1), 1), 2)

计算每行结果中1s的出现次数,因此它是

ans =
    2
    1
    2

现在,让我们获取每行元素的总数

size(A, 2)

仅减去找到的1s,您将获得每行的第一个索引。 (我们必须添加1,因为我们想要第一次出现。)

size(A, 2) + 1 - sum(A(row_sel, :) > rand(size(A, 1), 1), 2)

答案 1 :(得分:3)

您可以将A索引的row_sel_与随机值的列向量进行比较,利用implicit expansion;然后使用max的第二个输出,它给出沿指定维度的 first 最大值的索引:

[~, index] = max(A(row_sel,:) > rand(numel(row_sel),1), [], 2);

对于R2016b之前的Matlab,没有隐式扩展,但是您可以使用bsxfun

[~, index] = max(bsxfun(@gt, A(row_sel,:), rand(numel(row_sel),1)), [], 2);