【发布时间】:2019-02-22 09:30:50
【问题描述】:
我正在寻找一种更快的方法来使用不带循环的 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')
不能解决问题。感谢您的帮助!
【问题讨论】:
-
每个
i的随机数都不同。这是故意的吗?如果没有,为了清楚起见,您能否发布一个没有随机数的示例?另外,如果某些i没有这样的索引怎么办? -
是的,这是有意的,也是至关重要的(在我正在建模的经济体中,各主体之间的冲击是不相关的)。每个 i 肯定都有一个这样的索引,因为 A 的最后一列只包含一个(因为行包含概率的累积总和,在我的例子中,每行总和为一个)。
-
在您的示例中,
length(A)是行数或列数,以较大者为准。也许你的意思是length(row_sel)? -
很抱歉给您带来了困惑。我应该注意到,在我的例子中,A 总是一个方阵。
标签: matlab find vectorization