【问题标题】:How can I write this efficiently without using loop in Matlab?如何在 Matlab 中不使用循环有效地编写此代码?
【发布时间】:2012-04-12 10:47:34
【问题描述】:

dist=[1:100]; % distance

% conc. is concentration of size 1x100

conc=1  1   1   1   1   1   1   1   1   1   1   1   1   1   1   0.990000000000000   0.990000000000000   0.990000000000000   0.990000000000000   0.990000000000000   0.990000000000000   0.990000000000000   0.990000000000000   0.990000000000000   0.990000000000000   0.990000000000000   0.980000000000000   0.970000000000000   0.950000000000000   0.920000000000000   0.890000000000000   0.850000000000000   0.820000000000000   0.790000000000000   0.750000000000000   0.710000000000000   0.680000000000000   0.640000000000000   0.600000000000000   0.560000000000000   0.520000000000000   0.480000000000000   0.440000000000000   0.400000000000000   0.360000000000000   0.310000000000000   0.270000000000000   0.230000000000000   0.180000000000000   0.140000000000000   0.100000000000000   0.0700000000000000  0.0400000000000000  0.0200000000000000  0.0100000000000000  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

我想在conc 中找到与浓度值 0.16(或最接近的值)和 0.84(或最接近的值)对应的索引。我将使用该索引在这些索引处找到dist。需要注意的一点是,conc 值在大小为 100 的向量中以非线性关系从 1 递减到 0。我知道我们可以使用 find(),但我不确定它如何用于什么我想做。

如果可能的话,我希望能够在不使用循环的情况下有效地做到这一点。这是因为我有很多集中注意力的向量,而且我的代码中已经有很多循环。谢谢。

【问题讨论】:

    标签: matlab indexing find compare indices


    【解决方案1】:

    一个简单的解决方案是

    [x, i] = min(abs(conc - 0.16));
    

    之后i 将保存索引。这会比较 conc 向量的每个元素,这有点浪费,因为数据是有序的,您可以进行二分搜索,但在 matlab 级别实现的二分搜索对于一百个元素的向量可能会更慢。

    【讨论】:

    • 太棒了!你用那个简单的算法一针见血。
    • +1 不错。仅供参考,我有一个不错的带有基准的 M 代码 binsearch;在基准测试中,您的方式胜过 binsearch 多达几千个元素。 (可能取决于机器,因为min 是多线程的。)
    • 顺便说一句,除了我通过min(abs(conc - 0.16)) 获得的实际值之外,您能否告诉输出如何(或为什么)包括索引i?根据我的理解,我应该只获得x
    • @S_H 是 min 的二输出参数形式:mathworks.se/help/techdoc/ref/min.html
    • 哦,我明白了。感谢您的澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 2021-06-08
    • 1970-01-01
    • 2017-09-11
    • 2017-08-11
    • 2019-05-03
    • 1970-01-01
    相关资源
    最近更新 更多