我正在寻找一种更快的方式来使用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')
不能解决问题。感谢您的帮助!
答案 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);