【问题标题】:How to consider the value of a vector is in specific range of values of another matrix in matlab?如何考虑向量的值在matlab中另一个矩阵的特定值范围内?
【发布时间】:2015-04-27 11:01:28
【问题描述】:

我有一个大小为 54000 x 2 的向量 A。每一行包括该行可接受的最小值和可接受的最大值的范围。例如:

A=[0.5 1.5 ; 1 2.5; -0.5 1.5]

另一方面,我有一个大小为 300000 x 1 的向量 C。现在我想发现向量 C 的每个值可以放在矩阵 A 的哪些行中。例如:

C= [1.2; -0.3; 2.4 ]

现在,我需要知道向量 C 的每个值都可以位于 A 的哪些行中。所以索引的结果可能是这样的:

   c_indx(1,1)= [1,1,1]
   c_indx(2,1)= [0,0,1]
   c_indx(3,1)= [0,1,0]

感谢您的帮助

【问题讨论】:

  • 那么,您最终会得到54000 x 300000 大小的逻辑数组吗? XY problem?
  • 是的。因为我需要找到向量 C 和矩阵 A 之间的对应索引,所以我使用了逻辑数组。有没有更好的解决方案?

标签: matlab vector range


【解决方案1】:

对我来说更直观的是:

c_indx = bsxfun(@le,A(:,1).',C) & bsxfun(@ge,A(:,2).',C);

但是,通过使用行操作,它的计算速度应该更快,如下所示:

c_indx = cell2mat(arrayfun(@(x)(A(:,1)<=x & A(:,2)>=x).',C,'UniformOutput',false))

【讨论】:

  • THX 解决方案。它工作正常,但超级慢!由于这些大小的组合意味着应该完成 1.7 B 过程!有更快的代码吗?
【解决方案2】:

使用bsxfun

out = all(cat(3,bsxfun(@le,C(:),A(:,2).'),bsxfun(@ge,C(:),A(:,1).')),3);

示例运行:

A = [0.5 1.5 ; 1 2.5; -0.5 1.5];
C= [1.2; -0.3; 2.4];

>> out

out =

 1     1     1
 0     0     1
 0     1     0

A=[0.5,  1.5 ;  1,   2.5; -0.5,  1.5];

C= [1.2; -0.3;  2.4;  1.7;  0.3;  -0.6;  1.1];

>> out

out =

 1     1     1
 0     0     1
 0     1     0
 0     1     0
 0     0     1
 0     0     0
 1     1     1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多