[已解决] 生成随机向量,与目标向量成一定范围内的角度

[复制链接]
zhangxc0223 发表于 2021-9-22 13:56:53
请问这个应该怎么实现?想了好久都想不出来。。

现在有批量的目标向量A集合,均为单位球内的单位向量,比如A1=(1,0,0); A2=(sqrt(1/3), sqrt(1/3), sqrt(1/3)); A3...。
怎么生成随机的向量B集合 (B1, B2, B3...),使B与A集合中的每个对应向量(B1与A1,B2与A2,...)的夹角控制在10°以下?

最佳答案


15631202458 发表于 2021-9-23 10:27:15
用点积定理A·B=|A|*|B|*cos(cta);
首先给B向量赋初值例如三方向都是【-5,5】的随机数,然后判断cta是否小于10°,如果不满足则重新城市B,直到满足条件
代码如下:
  1. clear;
  2. clc;
  3. %构造单位向量A

  4. A=rand(10,3)*10;
  5. for i=1:length(A)
  6.     normA(i,1)=norm(A(i,:));
  7.     newA(i,:)=A(i,:)./normA(i);
  8.     new_normA(i,1)=norm(newA(i,:));
  9. end
  10. A=newA;
  11. % 构造B

  12. for i=1:length(A)
  13.     cta=20;
  14.     while(cta>=10)
  15.         B(i,:)=rand(1,3)*randi([2,5]);
  16.         cta=acosd(A(i,:)*B(i,:)'/norm(A(i,:))/norm(B(i,:)));
  17.         normB(i,:)=norm(B(:,:));
  18.     end
  19. %     i
  20. %     cta
  21. %     A(i,:)*B(i,:)'
  22. %     norm(A(i,:))
  23. %     norm(B(i,:))
  24. %     A(i,:)*B(i,:)'/norm(A(i,:))/norm(B(i,:))
  25.    
  26. end
复制代码
回复此楼

1 条回复


15631202458 发表于 2021-9-23 10:27:15
用点积定理A·B=|A|*|B|*cos(cta);
首先给B向量赋初值例如三方向都是【-5,5】的随机数,然后判断cta是否小于10°,如果不满足则重新城市B,直到满足条件
代码如下:
  1. clear;
  2. clc;
  3. %构造单位向量A

  4. A=rand(10,3)*10;
  5. for i=1:length(A)
  6.     normA(i,1)=norm(A(i,:));
  7.     newA(i,:)=A(i,:)./normA(i);
  8.     new_normA(i,1)=norm(newA(i,:));
  9. end
  10. A=newA;
  11. % 构造B

  12. for i=1:length(A)
  13.     cta=20;
  14.     while(cta>=10)
  15.         B(i,:)=rand(1,3)*randi([2,5]);
  16.         cta=acosd(A(i,:)*B(i,:)'/norm(A(i,:))/norm(B(i,:)));
  17.         normB(i,:)=norm(B(:,:));
  18.     end
  19. %     i
  20. %     cta
  21. %     A(i,:)*B(i,:)'
  22. %     norm(A(i,:))
  23. %     norm(B(i,:))
  24. %     A(i,:)*B(i,:)'/norm(A(i,:))/norm(B(i,:))
  25.    
  26. end
复制代码
回复此楼
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表