【问题标题】:Looking for a way to vectorize find command in Matlab在Matlab中寻找一种矢量化find命令的方法
【发布时间】: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


【解决方案1】:

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

[~, 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);

【讨论】:

  • 谢谢,这完美!只是我认为一定是..., rand(length(row_sel),1)), [],2);
【解决方案2】:

单线:

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)

计算每行结果中 1 的出现次数,所以这里是

ans =
    2
    1
    2

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

size(A, 2)

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

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

【讨论】:

  • @LuisMendo 感谢您的提示,您完全正确。我编辑了我的答案。
  • 顺便说一句,答案很好!
  • 我同意,这也是一个很好的答案,非常感谢! LuisMendo 的方法在我的示例中运行得更快,这就是我现在在代码中实现他的方法的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多